人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

●質問者: yuukunz
●カテゴリ:ウェブ制作
✍キーワード:MySQL たまたま サイト システム 普通に
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● b-wind
●35ポイント

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

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

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

◎質問者からの返答

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

納得できました。

ありがとうございます。


2 ● kurukuru-neko
●35ポイント

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

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

なる可能性が高いから

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

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

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

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

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

◎質問者からの返答

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

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


3 ● すまーとぼーい
●10ポイント

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

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

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


4 ● Strada
●10ポイント

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

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

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

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

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

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

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

?Like検索(非完全一致)

となります。

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

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

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

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

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

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


5 ● pigment
●10ポイント

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

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

昔言われてたのは、

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

ということでした。

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ