MYSQLに関して調べ物をしていたら
某質問サイトでたまたまこんな記述を発見しました。
普通に使ってしまっているのですが、
・なぜ使うべきではないのか
・使わない場合、具体的にどうすればいいのか
がわかる方がいらっしゃいましたら教えて下さい。
よろしくお願いします。
そのような検索条件だと、INDEX が使えないからです。
解決法としてはケースバイケースで基本的には同じ意味を持つが違う書き方の SQL を書き直すことになります。
場合によっては設計自体を変える必要も有るかもしれません。
検索対象の全件検索になるのでデータ件数が多かったり
多量の処理をした場合、システムへの負荷が非常に高く
なる可能性が高いから
もし使いたい場合は、より負荷の低い方法で同じことが
出来る全文検索の利用を考える。
http://www.ironhearts.com/diary/archives/000868.html
具体的な事例のリンクもつけていただいてありがとうございます。
非常に参考になりました。
一般的にコンピュータ(というかDBMS)がLIKEや!=の処理をするのが時間がかかるからです。ちなみに OR 条件も性能劣化の原因となります。
相対的な問題ですが、=やINで足りる場合はそちらを使うべきです。どうしてもLIKEや!=でしか現せないような式の場合のみLIKEや!=を使うようにすればいいかと思います(使ってはいけないということはないので)。
蛇足ですがBETWEENも性能が悪いです。しかも、BETWEENの場合は不等号とANDを使えば論理的に同値な演算として表せるので極力使うべきではありません。
一言で言えば、Like検索ではIndexが効かないからです。
いわゆるプライマリーキーなどにはインデックスと呼ばれる検索用のキーとなっており、このインデックスを辿る事により目的のレコードを早く走査できるような仕組みになっています。
しかし、Like検索ではインデックスとして用意されている仕組みを使えません(一部一致である為)。
また、一部一致である為、各レコードに関して判定を繰り返す必要があります。
したがって、一般的に検索速度は
①インデックスの張ってある項目(完全一致)
②インデックスの張ってない項目(完全一致)
③Like検索(非完全一致)
となります。
(Like検索では例えインデックスが張ってあってもインデックスは有効にならないのです)
参考URL: http://www.hi-ho.ne.jp/tsumiki/doc_1.html
どうすれば良いか、に関しては状況によるので一概には言えません。
例えばよく検索される単語であれば、DBに検索用のテーブルを別に用意し検索語からインデックス有の検索を行う事もあります。
ある程度の性能測定を行って、仕方なしと割り切るケースも多いです。
Like検索は行わせても、他のキーである程度絞り込んだ後に検索させるのも手です(絞り込んだ後にLike検索であれば母数が減る)。
特にMySQLに限った話ではなく、SQL全般の常識です。
常識は大嫌いなので押し付けたくはありません。
昔言われてたのは、
「INDEX が効かないのでとてつもなく遅くなる。絶対使うな!」
ということでした。
自分でDB作ろうと考え出したらやっぱり同じように「%を前後につけんじゃないよぉ~、高速化できないよぉ~」と言いたくなると思います。
しかし、現在のOracleだとSQLを工夫しても工夫前とコストが同じだったりします。
このあたりは今後、どんどん緩く考えられるようになっていくことでしょう。
しかし、MySQLとかだとやっぱまぢめに考えた分だけ早くなると思います。
なるほど。そういう意味でしたか。
納得できました。
ありがとうございます。