MySQLチューニング

1時間以上かかっていたあるselect文の実行が、MySQLの設定を変更したら、2分に短縮できた。
tmp_table_sizeを32Mから300Mに変更。が、これだけでは設定が有効にならない。
max_heap_table_sizeを16Mから300Mに変更する。
たとえば
select count(*) from ( select distinct ... ) a
のようなselectのネストの場合、括弧内のselectの実行結果がテンポラリテーブルに作成される。このテンポラリテーブルはオンメモリに作成されるが、テンポラリテーブルのサイズがtmp_table_sizeより大きくなると、/tmpディレクトリ下にISAMファイルとして作成されるが、ISAMファイルへの処理が遅く、極端に処理時間が増大してしまう。
なので、tmp_table_sizeを大きくすればいいのだが、テンポラリテーブルはヒープテーブルとして作成されるので、max_heap_table_sizeをtmp_table_sizeに合わせる必要がある。

http://bugs.mysql.com/bug.php?id=5514
http://bugs.mysql.com/bug.php?id=18875