InnoDB vs MyISAMシリーズはまだまだ続きます。
前回はこちら。
今回はLimitの件数の指定でどう変化するかと試してみます。
測定環境についてはこちらを参照して下さい。
・データ件数は100万件
・こちらの構造のテーブルをInnoDBとMyISAMで作成して処理速度を比較
以下SQL中の「テーブル名 normal」にはMyISAMなら normal2 がセットされます。
8.INDEXで5000件のデータ 先頭50件
SELECT name FROM normal WHERE country_id = %d LIMIT 50
※%dは1~200でランダムに変化
※country_idは1~200のランダム値で全体が100万件なので、非一意INDEXで5000件のうち先頭50件を取得します
※取得カラムはINDEX以外
| スレッド数 | MyISAM | InnoDB |
MyISAM 最高性能:最低性能= 1 : 0.87
InnoDB 最高性能:最低性能= 1 : 0.76
次に行きましょう。
9.INDEXで5000件のデータ 先頭5件
SELECT name FROM normal WHERE country_id = %d LIMIT 5
※前述のLIMIT 50をLIMIT 5に変更しただけです。
| スレッド数 | MyISAM | InnoDB |
MyISAM 最高性能:最低性能= 1 : 0.77
InnoDB 最高性能:最低性能= 1 : 0.67
なるほど・・・・。
10.INDEXで5000件のデータ 先頭1件
SELECT name FROM normal WHERE country_id = %d LIMIT 1
※前述のLIMIT 5をLIMIT 1に変更しただけです。
| スレッド数 | MyISAM | InnoDB |
MyISAM 最高性能:最低性能= 1 : 0.74
InnoDB 最高性能:最低性能= 1 : 0.61
ここまで見てくるとハッキリしたと思います。
- データページに対するIOが多いクエリーの場合、(IOが少ないクエリーに比べて)遅いのは確かだが同時スレッド数による性能劣化が緩やか
- ある程度以上IOが多いと同時スレッド数による性能劣化はなくなる(だからといってIOが多いのが良い訳ではないが)
- MyISAMのほうが競合による性能劣化が緩やか
- ただし性能を出し切る(グラフのピーク部分)ためは同時スレッド数を制御する必要がある
- 同時スレッドを抑えるための仕組みが必要(これはまた今後の機会に)
とりあえずの結論です。






