🔥

【MySQL】where句内のOR演算子とインデックスについて

2023/03/10に公開

気になったこと

複数カラムのOR検索について、複合インデックスか、それぞれでの単一インデックスでいいのか、どちらがいいのだろうとふと気になったので調べてみたことをメモしました。

参考

https://zenn.dev/team_soda/articles/ce989fa4cbe4c2#これを読むと何が分かるようになるのか

https://zenn.dev/jnuank/articles/0da8d4755e69fea30bab

OR検索について

以前OR検索の場合、フルテーブルスキャンになるっていっていた人がいたが、それは違うっぽい。(そりゃそうだ。教えてあげればよかった笑)

  1. Where句内のOR演算子で、インデックスが張られていないカラムが検索条件に混ざっている場合にフルテーブルスキャンになる(これは自然)
  2. Where句内のOR演算子で、検索条件に指定してるカラムすべてに個別にインデックスを張っている場合はフルテーブルスキャンにならない(MySQL5.6よりは前はフルテーブルスキャンになったらしいが、MySQL5.6以降ではインデックスマージという最適化が入る。ただし5.6でも全文検索において例外あり。)
  3. 全文検索時のFULLTEXTインデックス(転置インデックス)を使用している場合は、Where句内でOR演算子を使うことでフルテーブルスキャンになる

速度的な問題

では、OR検索のとき、単一インデックスの組み合わせと複数インデックスどちらがいいのか?
既に上述した通り、インデックスマージという最適化が入るのでおそらく同じくらいだろうなと予想...

参考に掲載した記事の検証結果からも分かる通り、ほぼ変わらないっぽい

各単一インデックスと、複合列インデックスを用意したパターンでそこまで大きな違いは無いように見えます

結局どうなの?

まあ、私の場合、今回は複合インデックスを使用しようかなと思います。
インデックスマージの最適化を知らない人からすると、コードレビュー時に違和感が少しあると思うので....

Discussion