本記事は以下の記事を参考にしています。
結論
変わる。
PRIMARY KEYをつけた方がSELECT文の実行速度が速い。
開発環境
root@{CONTAINER_ID}:/# mysql --version mysql Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)
PRIMARY KEYの有無によってパフォーマンスは変わるのか?
MySQLの記事を見ていたら、上記の記事にたどり着いた。
手元で真似て試してみる。
PRIMARY KEY無しレコードの作成
ストアドプロシージャの定義
パフォーマンスを計測するために複数回INSERTできるストアドプロシージャを作った。
DELIMITER // CREATE PROCEDURE iota_insert(IN i INT) BEGIN DECLARE count INT DEFAULT 0; WHILE count < i DO SET count = count + 1; INSERT INTO t0 VALUES(count, count); END WHILE; END // DELIMITER ;
ストアドプロシージャの実行
mysql> CREATE TABLE t0( -> age INT NOT NULL, -> height INT NOT NULL -> ) -> ; mysql> call iota_insert(100000); Query OK, 1 row affected (3 min 8.48 sec)
PRIMARY KEY有りレコードの作成
ストアドプロシージャの定義
DELIMITER // CREATE PROCEDURE iota_insert_t1(IN i INT) BEGIN DECLARE count INT DEFAULT 0; WHILE count < i DO SET count = count + 1; INSERT INTO t1 VALUES(0, count, count); END WHILE; END // DELIMITER ;
ストアドプロシージャの実行
mysql> CREATE TABLE t1( -> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -> age INT NOT NULL, -> height INT NOT NULL -> ) -> ; mysql> call iota_insert_t1(100000); Query OK, 1 row affected (3 min 4.45 sec)
パフォーマンスの比較
今回はSELECTの実行速度で比較。
# PRIMARY KEY無し mysql> SELECT * FROM t0 WHERE age=1234; +------+--------+ | age | height | +------+--------+ | 1234 | 1234 | +------+--------+ 1 row in set (0.05 sec) # PRIMARY KEY有り mysql> SELECT * FROM t1 WHERE age=1234; +------+------+--------+ | id | age | height | +------+------+--------+ | 1234 | 1234 | 1234 | +------+------+--------+ 1 row in set (0.02 sec)
PRIMARY KEY有りの方が2.5倍速い。
複数回試してもそれぞれ似たような速度だった。
PRIMARY KEYを付けたほうがSELECT文の実行が速いことが分かった。
なぜこうなるのかまでは今回は追えなかったが、後々見ていく。