"「LIKE '%...%'」や「NOT LIKE」、「!=」は、性能を重視したシステムでは使うべきものではありません。"


MYSQLに関して調べ物をしていたら
某質問サイトでたまたまこんな記述を発見しました。

普通に使ってしまっているのですが、

・なぜ使うべきではないのか
・使わない場合、具体的にどうすればいいのか

がわかる方がいらっしゃいましたら教えて下さい。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/03/02 21:50:19
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント35pt

そのような検索条件だと、INDEX が使えないからです。

解決法としてはケースバイケースで基本的には同じ意味を持つが違う書き方の SQL を書き直すことになります。

場合によっては設計自体を変える必要も有るかもしれません。

id:yuukunz

なるほど。そういう意味でしたか。

納得できました。

ありがとうございます。

2007/03/02 21:47:34
id:kurukuru-neko No.2

回答回数1844ベストアンサー獲得回数155

ポイント35pt

検索対象の全件検索になるのでデータ件数が多かったり

多量の処理をした場合、システムへの負荷が非常に高く

なる可能性が高いから

もし使いたい場合は、より負荷の低い方法で同じことが

出来る全文検索の利用を考える。

http://www.ironhearts.com/diary/archives/000868.html

http://d.hatena.ne.jp/mir/20060802/p1

http://qwik.jp/senna/mysql_binding.html

id:yuukunz

具体的な事例のリンクもつけていただいてありがとうございます。

非常に参考になりました。

2007/03/02 21:49:42
id:endeavor No.3

回答回数78ベストアンサー獲得回数1

ポイント10pt

一般的にコンピュータ(というかDBMS)がLIKEや!=の処理をするのが時間がかかるからです。ちなみに OR 条件も性能劣化の原因となります。

相対的な問題ですが、=やINで足りる場合はそちらを使うべきです。どうしてもLIKEや!=でしか現せないような式の場合のみLIKEや!=を使うようにすればいいかと思います(使ってはいけないということはないので)。

蛇足ですがBETWEENも性能が悪いです。しかも、BETWEENの場合は不等号とANDを使えば論理的に同値な演算として表せるので極力使うべきではありません。

id:Strada No.4

回答回数18ベストアンサー獲得回数1

ポイント10pt

一言で言えば、Like検索ではIndexが効かないからです。

いわゆるプライマリーキーなどにはインデックスと呼ばれる検索用のキーとなっており、このインデックスを辿る事により目的のレコードを早く走査できるような仕組みになっています。

しかし、Like検索ではインデックスとして用意されている仕組みを使えません(一部一致である為)。

また、一部一致である為、各レコードに関して判定を繰り返す必要があります。

したがって、一般的に検索速度は

①インデックスの張ってある項目(完全一致)

②インデックスの張ってない項目(完全一致)

③Like検索(非完全一致)

となります。

(Like検索では例えインデックスが張ってあってもインデックスは有効にならないのです)

参考URL: http://www.hi-ho.ne.jp/tsumiki/doc_1.html

どうすれば良いか、に関しては状況によるので一概には言えません。

例えばよく検索される単語であれば、DBに検索用のテーブルを別に用意し検索語からインデックス有の検索を行う事もあります。

ある程度の性能測定を行って、仕方なしと割り切るケースも多いです。

Like検索は行わせても、他のキーである程度絞り込んだ後に検索させるのも手です(絞り込んだ後にLike検索であれば母数が減る)。

id:pigment No.5

回答回数95ベストアンサー獲得回数2

ポイント10pt

特にMySQLに限った話ではなく、SQL全般の常識です。

常識は大嫌いなので押し付けたくはありません。

昔言われてたのは、

「INDEX が効かないのでとてつもなく遅くなる。絶対使うな!」

ということでした。

自分でDB作ろうと考え出したらやっぱり同じように「%を前後につけんじゃないよぉ~、高速化できないよぉ~」と言いたくなると思います。

しかし、現在のOracleだとSQLを工夫しても工夫前とコストが同じだったりします。

このあたりは今後、どんどん緩く考えられるようになっていくことでしょう。

しかし、MySQLとかだとやっぱまぢめに考えた分だけ早くなると思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • 調べ物をしていたら "「LIKE '%...%'」や「NOT LIKE」、「!=」は、性能を重視したシステムでは使うべきものではありません。" MYSQLに関して調べ物をしていたら 某質問サイトでた
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません