木曜日、仕事で扱ってるデータベースで検索が遅いという苦情が入った。

色々調べてみて、何が悪いのかサッパリだったんだけど、インデックスを外してみたりしてて解決したので、一応その時のことを書いておこうと思う。

まずテーブルの詳細だけど、10カラムくらいの構造に、Intがプライマリキー、ENUMにインデックスを設定して、データ登録件数は約1000件。

これをテーブルAとする

SELECTする時に、20万件くらいのテーブルと200万件くらいのテーブルをプライマリキーでJOINする。

この二つはテーブルXとテーブルY。

この条件で、以下のSQLを打ち込むと、10秒くらい掛かってしまう。

SELECT * FROM A, X, Y WHERE A.id = X.AID AND X.id = Y.XID AND A.ENUM = ‘test’ LIMIT 10000

なぜこんなに時間かかるのか分からないが、ENUMからインデックスを外すと、1秒以内に終わるようになる。

MySQLのオプティマイザーが馬鹿なのかもしれないが、とにかく何でもインデックス付ければ早くなるとは思わないほうが良いらしい。