前回からの続きで、InnoDBとMyISAMのパフォーマンス測定を続けています。

同一の環境で、同時スレッドを64,128,192,256,512と変えながら1秒間のクエリー処理数を計測しました。

初期化パラメータは前回と同様です。

[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking

sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 64
max_allowed_packet = 16M
key_buffer_size=1250M
innodb_buffer_pool_size=1250M
innodb_log_file_size=10M
innodb_thread_concurrency=8
max_connections=1500
table_cache=1024
net_read_timeout=30
net_write_timeout=30
back_log=128

スレッド数 MyISAM InnoDB

PrimaryKeyによるランダムアクセスの計測結果(スレッド数64~512)



おかしいです。
MyISAMの性能限界が見えないような感じになってしまいました。
それはいくらなんでもあり得ないので、調べてみたら、計測ツール側でコネクションのエラーが発生していました。
コネクションのエラーの発生はthread_cache_sizeの値と関係するようです。

thread_cache_sizeを64,256,1024と変えて計測してみました。

スレッド数 64 256 1024

MyISAMでthread_cache_size=64,256,1024で計測



thread_cache_sizeを大きくすると、破綻するポイントがずれていきますが、512同時スレッドあたりになると、やはり今回のサーバでは無理なようです。

128同時スレッドあたりまでは、なんとかいけそうなのでそこまでを対象にすることにします。

あらためてInnoDBとMyISAMを比較しました。

初期化パラメータは以下に変更しました。

thread_cache_size = 1024
innodb_thread_concurrency=8

※innodb_thread_concurrencyの設定値についてはこちら。

スレッド数 MyISAM InnoDB

PrimaryKeyによるランダムアクセスの計測結果(最終結果)



同時スレッド4あたりのピーク部分ではInnoDBのほうが数%速いようです。
また、同時スレッドを上げていった時の性能下降の度合いは、MyISAMの方が低いようです。

ただし、このあたりはかなり微妙な違いなので、サーバのCPU性能・ディスク性能の状況によって違いが出てくると思います。

ということで、

PrimaryKeyによるランダムアクセスではInnoDBとMyISAMのパフォーマンスはほぼ同じ

というのがこの場合の結論になるかと思います。

ということで、次回から、いろいろなSQLパターンでの比較検証に入りたいと思います。

続きます