カルボナーラ街道

計測と観察

MySQLでPRIMARY KEYの有無によってパフォーマンスは変わるのか?

本記事は以下の記事を参考にしています。

yoku0825.blogspot.com


結論

変わる。
PRIMARY KEYをつけた方がSELECT文の実行速度が速い。

開発環境

root@{CONTAINER_ID}:/# mysql --version
mysql  Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)

PRIMARY KEYの有無によってパフォーマンスは変わるのか?

日々の覚書: 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文の実行が速いことが分かった。

なぜこうなるのかまでは今回は追えなかったが、後々見ていく。

参考