前回のUPDATEに続いて今回はDELETEとINSERTのパフォーマンスを比較します。
測定環境についてはこちらを参照して下さい。
・データ件数は100万件
・こちらの構造のテーブルをInnoDBとMyISAMで作成して処理速度を比較
以下SQL中の「テーブル名 normal」にはMyISAMなら normal2 がセットされます。
DELETE FROM normal WHERE id = %d
※%idは1~100万の範囲でランダムに変化
| スレッド数 | MyISAM | InnoDB |
| 1 | 86.00 | 109.00 |
| 2 | 143.67 | 122.67 |
| 4 | 326.67 | 120.00 |
| 8 | 689.33 | 126.67 |
| 16 | 530.67 | 127.67 |
| 32 | 400.33 | 126.00 |
| 64 | 626.33 | 130.00 |
MyISAMの性能にかなりばらつきがありますが4~7倍程度MyISAMが高速です。
InnoDBは同時スレッド数による性能変化がまったく見られません。
INSERT IGNORE INTO normal (id, name, password, email, city, zip, dob, country_id, state_id) VALUES (%d, %s, %s, %s, %s, %s, NOW(), %d, %d)
※%dや%s等はすべてランダムな値がセットされます。
| スレッド数 | MyISAM | InnoDB |
| 1 | 322.00 | 122.33 |
| 2 | 287.33 | 121.33 |
| 4 | 280.330 | 121.33 |
| 8 | 410.67 | 116.33 |
| 16 | 1,231.67 | 113.00 |
| 32 | 1,696.00 | 113.00 |
| 64 | 1,794.67 | 112.33 |
3~15倍程度MyISAMが高速です。
特に、同時スレッドに比してQPSが上昇していきます。
通常、更新があるシステムの場合はInnoDBを採用するのが原則ですが、
ログ出力など細かいこと?を気にしない用途の場合にMyISAMはかなり有効だと言えます。
6月 10
そもそもトランザクションがあるエンジン(InnoDB)と無いエンジン(MyISAM)を比較して
意味があるのかと言われるとそれまでですが、一応、更新系のパフォーマンスも比較してみます。
MyISAMの圧勝が想像できますが。
測定環境についてはこちらを参照して下さい。
・データ件数は100万件
・こちらの構造のテーブルをInnoDBとMyISAMで作成して処理速度を比較
以下SQL中の「テーブル名 normal」にはMyISAMなら normal2 がセットされます。
UPDATE normal SET name=%s,dob=NOW() WHERE id = %d
※%idは1~100万の範囲でランダムに変化
※%sにはランダムな文字列をセットします
※nameもdobもINDEXには指定されていません
| スレッド数 | MyISAM | InnoDB |
| 1 | 156.67 | 122.00 |
| 2 | 271.33 | 118.00 |
| 4 | 414.00 | 118.33 |
| 8 | 670.67 | 122.00 |
| 16 | 878.00 | 121.67 |
| 32 | 728.67 | 118.67 |
| 64 | 879.67 | 119.00 |
やはり6~8倍程度MyISAMが速いですね。
UPDATE normal SET email=%s,dob=NOW() WHERE id = %d
※%idは1~100万の範囲でランダムに変化
※%sにはランダムな文字列をセットします
※emailはUnique INDEXに指定されています
| スレッド数 | MyISAM | InnoDB |
| 1 | 156.67 | 122.00 |
| 2 | 271.33 | 118.00 |
| 4 | 414.00 | 118.33 |
| 8 | 670.67 | 122.00 |
| 16 | 878.00 | 121.67 |
| 32 | 728.67 | 118.67 |
| 64 | 879.67 | 119.00 |
7倍程度MyISAMが高速です。
更新項目が非INDEXの場合に比べて、それほど遅くなっている印象がありません。
次回はdeleteとinsertを計測します。
6月 09
INNER JOINに続いて、今度はLEFT JOINのパフォーマンス比較です。
測定環境についてはこちらを参照して下さい。
・データ件数は100万件
・こちらの構造のテーブルをInnoDBとMyISAMで作成して処理速度を比較
・entryとentry2は記事を格納するテーブルで100万件登録されています。
・entry_commentとentry_comment2はコメントを格納するテーブルで、こちらも100万件登録されています。
・PRIMARY KEYであるidには1~1000000の値がセットされています。
・1記事に対して、1コメントが存在しています。・以下の構造のテーブルをInnoDBとMyISAMで作成して処理速度を比較
以下SQL中の「テーブル名 entryとentry_comment」にはMyISAMなら entry2とentry_comment2 がセットされます。
※%sはランダムに変化します。
実行計画は同じです。
| スレッド数 | MyISAM | InnoDB |
| 1 | 83.67 | 130.67 |
| 2 | 136.67 | 256.67 |
| 4 | 235.33 | 411.67 |
| 8 | 314.00 | 474.00 |
| 16 | 384.33 | 467.67 |
| 32 | 444.67 | 448.33 |
| 64 | 489.00 | 439.33 |
8同時スレッドのピーク時性能で50%程度、InnoDBのほうが高速です。
ただし64スレッド以上だと、MySQLのほうが高速になります。
それと、InnerJoinに比べると、処理性能が1/3程度になってしまっています。
6月 08
副問い合わせに続いて、今度はINNER JOINのパフォーマンス比較です。
測定環境についてはこちらを参照して下さい。
・データ件数は100万件
・こちらの構造のテーブルをInnoDBとMyISAMで作成して処理速度を比較
・entryとentry2は記事を格納するテーブルで100万件登録されています。
・entry_commentとentry_comment2はコメントを格納するテーブルで、こちらも100万件登録されています。
・PRIMARY KEYであるidには1~1000000の値がセットされています。
・1記事に対して、1コメントが存在しています。・以下の構造のテーブルをInnoDBとMyISAMで作成して処理速度を比較
以下SQL中の「テーブル名 entryとentry_comment」にはMyISAMなら entry2とentry_comment2 がセットされます。
※%sはランダムに変化します。
実行計画は同じですね。
| スレッド数 | MyISAM | InnoDB |
| 1 | 265.67 | 976.67 |
| 2 | 889.00 | 1,679.00 |
| 4 | 1,321.33 | 1,514.33 |
| 8 | 1975.33 | 1,117.00 |
| 16 | 918.33 | 1,044.00 |
| 32 | 925.33 | 1,025.33 |
| 64 | 939.33 | 1,080.67 |
4同時スレッドのピーク時性能で15%程度、InnoDBのほうが高速です。
同時スレッド数に対するスケーラビリィティの傾向が他のものと異なっています。
次回はLeftJoinを試してみます。
6月 07
InnoDB vs MyISAMシリーズでブログ風のテーブル設計にして、
副問い合わせのパフォーマンスを試してみました。
測定環境についてはこちらを参照して下さい。
・データ件数は100万件
・こちらの構造のテーブルをInnoDBとMyISAMで作成して処理速度を比較
・entryとentry2は記事を格納するテーブルで100万件登録されています。
・entry_commentとentry_comment2はコメントを格納するテーブルで、こちらも100万件登録されています。
・PRIMARY KEYであるidには1~1000000の値がセットされています。
・1記事に対して、1コメントが存在しています。・以下の構造のテーブルをInnoDBとMyISAMで作成して処理速度を比較
以下SQL中の「テーブル名 entryとentry_comment」にはMyISAMなら entry2とentry_comment2 がセットされます。
※%sはランダムに変化します。
2.rowの表現が食い違っています。
InnoDBは type: const ですが、MyISAMは type: eq_ref となっています。
ただ、両方ともに key: PRIMARY で、 ref: const なので問題ないようです。
| スレッド数 | MyISAM | InnoDB |
| 1 | 498.67 | 1,192.33 |
| 2 | 1,410.33 | 1,714.33 |
| 4 | 1,460.00 | 1,711.33 |
| 8 | 1,442.00 | 1,668.00 |
| 16 | 1,328.33 | 1,550.67 |
| 32 | 1,236.33 | 1,386.00 |
| 64 | 1,150.67 | 1,162.67 |
2~8同時スレッドのピーク時性能で15~20%程度、InnoDBのほうが高速のようです。
同時スレッド数に対するスケーラビリィティは、これまで見てきた通り、MyISAMが優秀で、
おそらく128同時スレッド数あたりでは、優劣が逆転すると思います。
次回はInnerJoinを試してみます。
6月 06