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

INDEXで5000件のデータ 先頭50件


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

INDEXで5000件のデータ 先頭5件


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

INDEXで5000件のデータ 先頭1件


MyISAM 最高性能:最低性能= 1 : 0.74
InnoDB 最高性能:最低性能= 1 : 0.61

ここまで見てくるとハッキリしたと思います。

  • データページに対するIOが多いクエリーの場合、(IOが少ないクエリーに比べて)遅いのは確かだが同時スレッド数による性能劣化が緩やか
  • ある程度以上IOが多いと同時スレッド数による性能劣化はなくなる(だからといってIOが多いのが良い訳ではないが)
  • MyISAMのほうが競合による性能劣化が緩やか
  • ただし性能を出し切る(グラフのピーク部分)ためは同時スレッド数を制御する必要がある
  • 同時スレッドを抑えるための仕組みが必要(これはまた今後の機会に)

とりあえずの結論です。