mysql4.0チューニング

諸事情で今となってはレガシーなmySQL4.0に大量のデータをプログラムからぶちこむことになり。。
1時的にでもパフォーマンスをあげなければいけなくなった。

条件

MySQL4.0
対象テーブルのストレージエンジンはMyISAM、数百万レコード
3年以上稼働しており、枯れているのでmy.cnfはいじらず。。

検討

  • 対象テーブルのindexを一旦解除し、index作成のオーバーヘッドを減らす。
    • 対象テーブルのindexを試しに一つ削除してみる
      mysql> drop index index_name on table_name;
      • 消し終わるのに45minかかってしまった。。これでは意味が無い。
      • 試しにcreate indexしても同じくらいの時間を要する。一つのindexでこれだけ時間かかってはたまらない。
    • alter table disable keysで一時的にindexを無効にしてみる
      • ほぼ一瞬で完了。
      • しかし、プログラムでデータインサートしており、その際に対象テーブルの参照も行われるので、indexがないことにより逆にめちゃくちゃ時間かかる
      • ためしにalter table enable keysでindexしたところ、これも1時間近くかかる
    • optimize table table_nameをしてみる
      • optimize tableはデータとindexを最適化する。(デフラグのようなもの)
      • データ更新が多いMyISAMに強い効果がある
      • 実行し、プログラムを実施したら劇的に早くなった。
      • ただし、、45minほど時間を要してしまったので、トータルでみると元の時間と結局≒に。。
      • しかも読み取りまでロックされてしまうので、影響が多い。
      • 途中で止めたら死ぬ。(repearするまで動かない
    • analyze table table_nameをしてみる
      • optimize tableのindexのみ版
      • optimizeと比較してかなり早くおわった。
      • ただしプログラム実行時間にそこまで違いがないような。。。
    • alter table table_name key MyISAM
      • 今度はこれで試す