sqlite3でLIKE検索する時にインデックスがあると逆に遅くなることがある

投稿者: | 2015年1月15日

ITエンジニアとしての経験はそろそろ8年ぐらいになるけど、実はDBの経験はあまり無い。
基本情報取る時にちょこっと勉強したぐらいで、実務ではほとんど使ったこと無かった。組み込み系だとあんまり使うことないのよね。

最近、実務でDBを触る機会が一気に増えた。良い機会だしちょっとずつ勉強中です。
そんな中、悩まされた事件があったので備忘録として書き留めておく。

約100万件レコードがあるテーブルに対して以下のようなクエリで検索した所、テスト環境では20秒程だったのに、
本番環境では150秒以上掛かるという事件が起きた。

SELECT id FROM hoge_table WHERE (name_a LIKE ‘%hoge%’ ESCAPE ‘\’) OR (name_b LIKE ‘%hoge%’ ESCAPE ‘\’) ORDER BY name_a

テスト環境と本番環境の違いを見比べて、テスト環境にはインデックスが無いことに気づいたが、
まさかね・・・高速に検索するためのインデックスが原因で遅くなるなんてことないよね。
なんて思いながらもググってみると以下のブログ記事が引っかかった。

sqlite3 like検索でインデックスが逆効果になる?
http://blog.starbug1.com/archives/265

そもそも今回のような部分一致検索ではインデックスが使わないので(これも知らなかったけど)半信半疑ながら試しにname_aカラムで貼っていたインデックスを削除。
そうするとテスト環境と同等に20秒程で検索できるようになった。
どうやらインデックスが影響していたことは間違いなさそう。

更に、インデックスを削除することで元々1GB近くあったファイルサイズが半分以下になった。
インデックスってものすごくファイルサイズ増えるのね。

sqlite意外と楽しい。まだまだ知らないことがいっぱい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*