MySQLのInnoDBとMyISAMのパフォーマンス比較をしてみましたー
対象のMySQLのバージョンは5.7と8.0です。
結論としては、
- INSERTはMyISAMの方が早い
- SELECT・UPDATE・DELETEは
- 8.0ではInnoDBの方が早い
- 5.7ではSELECT・DELETEはMyISAMの方が早い。UPDATEはInnoDBの方が早い
という結果でしたー!
なお、MySQLのバージョンごとのサポート期限は以下のようになっています。
MySQLバージョン | MySQL | AWS RDSのMySQL | AWS AuroraのMySQL |
5.7 | 2023年10月 | 2024 年 2 月 | 2024 年 10 月 31 日 (Aurora バージョン2) |
8.0 | 2026年4月30日 | 未定 | 未定 (Aurora バージョン3) |
検証条件
- MySQL5.7-MyISAMで、1万件のデータ登録をした後、SELECT・UPDATE・DELETE
- MySQL5.7-InnoDBで、1万件のデータ登録をした後、SELECT・UPDATE・DELETE
- MySQL8.0-MyISAMで、1万件のデータ登録をした後、SELECT・UPDATE・DELETE
- MySQL8.0-InnoDBで、1万件のデータ登録をした後、SELECT・UPDATE・DELETE
比較結果詳細
MySQL5.7 | MySQL8.0 | |||
MyISAM | InnoDB | MyISAM | InnoDB | |
1万件データ作成 | 24.96 sec | 53.24 sec | 21.39 sec | 48.92 sec |
1万件カウント | 0.00016000 sec | 0.00359175 sec | 0.00018900 sec | 0.00850275 sec |
1件SELECT | 0.00127125 sec | 0.00401250 sec | 0.07204400 sec | 0.00575250 sec |
1件UPDATE | 0.06670350 sec | 0.01640200 sec | 0.02672875 sec | 0.01512700 sec |
1件DELETE | 0.00380375 sec | 0.00935400 sec | 0.02560125 sec | 0.01409000 sec |
準備
検証環境:AWS RDS
インスタンスクラス:db.t3.micro
-- 区切り文字を「//」に変更する
DELIMITER //
-- make_sample_dataというテストデータ作成用プロシージャーを作成する
create procedure make_sample_data(in i int)
begin
declare count int default 0;
-- 繰り返し
while count < i do
set count = count + 1;
INSERT INTO user VALUES(count, MOD(count,2),CONCAT('usr_name_',count));
end while;
end
//
-- 区切り文字を「;」に戻す
DELIMITER ;
MySQL5.7 MyISAM
create table user(
id INT,
type INT,
name VARCHAR(255)
) engine MyISAM;
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.41-log |
+------------+
1 row in set (0.00 sec)
◾️1万件データ作成
call make_sample_data(10000);
Query OK, 1 row affected (24.96 sec)
◾️1万件カウント
select count(*) from user;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
0.00016000
◾️1件SELECT
select * from user where id = 5000;
+------+------+---------------+
| id | type | name |
+------+------+---------------+
| 5000 | 0 | usr_name_5000 |
+------+------+---------------+
0.00127125
◾️1件UPDATE
update user set name = 'name_5001' where id = 5001;
0.06670350
◾️1件DELETE
delete from user where id = 5002;
0.00380375
MySQL5.7 InnoDB
create table user(
id INT,
type INT,
name VARCHAR(255)
) engine InnoDB;
◾️1万件データ作成
call make_sample_data(10000);
Query OK, 1 row affected (53.24 sec)
◾️1万件カウント
select count(*) from user;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
0.00359175
◾️1件SELECT
select * from user where id = 5000;
+------+------+---------------+
| id | type | name |
+------+------+---------------+
| 5000 | 0 | usr_name_5000 |
+------+------+---------------+
0.00401250
◾️1件UPDATE
update user set name = 'name_500001' where id = 5001;
0.01640200
◾️1件DELETE
delete from user where id = 5002;
0.00935400
MySQL8.0 MyISAM
create table user(
id INT,
type INT,
name VARCHAR(255)
) engine MyISAM;
select version();
+-----------+
| version() |
+-----------+
| 8.0.32 |
+-----------+
◾️1万件データ作成
call make_sample_data(10000);
Query OK, 1 row affected (21.39 sec)
◾️1万件カウント
select count(*) from user;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
0.00018900
◾️1件SELECT
select * from user where id = 5000;
+------+------+---------------+
| id | type | name |
+------+------+---------------+
| 5000 | 0 | usr_name_5000 |
+------+------+---------------+
0.07204400
◾️1件UPDATE
update user set name = 'name_500001' where id = 5001;
0.02672875
◾️1件DELETE
delete from user where id = 5002;
0.02560125
MySQL8.0 InnoDB
create table user(
id INT,
type INT,
name VARCHAR(255)
) engine InnoDB;
◾️1万件データ作成
call make_sample_data(10000);
Query OK, 1 row affected (48.92 sec)
◾️1万件カウント
select count(*) from user;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
0.00850275
◾️1件SELECT
select * from user where id = 5000;
+------+------+---------------+
| id | type | name |
+------+------+---------------+
| 5000 | 0 | usr_name_5000 |
+------+------+---------------+
0.00575250
◾️1件UPDATE
update user set name = 'name_500001' where id = 5001;
0.01512700
◾️1件DELETE
delete from user where id = 5002;
0.01409000
まとめ
MySQLのInnoDBとMyISAMのパフォーマンス比較をしてみましたー
結論としては、
- INSERTはMyISAMの方が早い
- SELECT・UPDATE・DELETEは
- 8.0ではInnoDBの方が早い
- 5.7ではSELECT・DELETEはMyISAMの方が早い。UPDATEはInnoDBの方が早い
という結果でしたー!
MyISAMとInnoDBの違いを比較した記事もありますので、よろしければ、ご参照くださいー