White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

MySQLでインデックス設定したらすげー早くなった

知らなくてごめんなさい。こんなこと業務でやってる人とかは当然なんだろうけど。

今までid以外にインデックスを指定してなかったのだけど、別のカラムにインデックスを指定したら5倍くらい速くなった。

処理内容

twitterの発言をMeCabで分割した後、マルコフ連鎖の「現在の単語:次の単語」の組み合わせで保存する(以降この組み合わせの表をマルコフテーブルと呼ぶ)。
保存前に既にその組み合わせがあるかどうかチェック。既にあればその項目のcountに+1する。

スペック

  • Core2Duo E6600, メモリ2GB, Ubuntu 8.10 32bit, MySQL 5.0
  • ストレージエンジンはMyISAM使用。それ以外はUbuntuデフォルトほぼそのまま
  • 発言 全38700件中 処理対象約12000件
  • 条件A:インデックスは特に作らず,条件B:「現在の単語」でインデックス作成

テスト1 既存マルコフテーブル 0件

条件 時間[min] 件数[件] 時間当たり処理件数[件/min]
A 5min 250 50

テスト2 既存マルコフテーブル 20万件

条件 時間[min] 件数[件] 時間当たり処理件数[件/min]
B 5 150 30
A 5 30 6

テスト3 検索速度

検索単語 条件A検索時間[sec] 条件B検索時間[sec] 結果件数
start(開始文字) 0.35 0.16 約9000件
むきゅー 0.27 0.00 1件

尚検索の際にはRESET QUERY CACHE;でクエリーキャッシュは消しています。

結論

テスト1と2をみればわかる通り、検索するデータが増えると、インデックスない場合大幅に速度が低下しますね。
あとインデックスを作るとselectの速度も当然あがります。まあ上記の結果は厳密に測定してるわけではないのでばらつきはあるんでしょうが。あとインデックスを作った場合insertはその分遅くなるんでしょうけど、どのくらい遅くなるんでしょう。