web-dev-qa-db-ja.com

部分文字列を含む行を検索する方法は?

ユーザーがフォームを送信するたびにHTML TEXTAREAをODBCデータベースに保存する場合、1を取得するSELECTステートメントとは何ですか1)指定された部分文字列2を含むすべての行)しないすべての行(検索で大文字と小文字が区別されますか?)


編集:if LIKE "%SUBSTRING%"は遅くなります。すべてを取得してPHPで整理する方が良いでしょうか。

35
Mawg

さて、いつでもWHERE textcolumn LIKE "%SUBSTRING%"を試すことができますが、左側の文字を探しているため、クエリでインデックスマッチを実行できないため、かなり遅いことが保証されています。

それはフィールドタイプに依存します-通常、textareaはVARCHARとしてではなく、(一種の)TEXTフィールドとして保存されるため、 MATCH AGAINST 演算子を使用できます。

一致しない列を取得するには、WHERE textcolumn NOT LIKE "%SUBSTRING%"などの前に単純にNOTを挿入します。

検索で大文字と小文字が区別されるかどうかは、データの保存方法、特に使用するコレクションに依存します。デフォルトでは、検索では大文字と小文字が区別されません。

質問の更新を反映するために回答を更新しました:

列フィールドにインデックスがある場合、WHERE field LIKE "%value%"を実行するとWHERE field LIKE "value%"よりも遅くなりますが、すべての値を取得してアプリケーションフィルターを使用するよりもかなり高速です。両方のシナリオ:

1/SELECT field FROM table WHERE field LIKE "%value%"を実行すると、MySQLはテーブル全体をスキャンし、「値」を含むフィールドのみを送信します。

2/SELECT field FROM tableを実行し、アプリケーション(お使いの場合はPHP)に「値」が含まれる行のみをフィルタリングする場合、MySQLはテーブル全体もスキャンしますが、すべてのフィールドをPHPに送信します。追加の作業を行う必要があります。これはケース#1よりもはるかに遅いです。

解決策:WHERE句を使用し、EXPLAINを使用してパフォーマンスを確認してください。

37
Konerak

MySQLの全文検索に関する情報。これはMyISAMテーブルに制限されているため、別のテーブルタイプを使用する場合は適切ではない可能性があります。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

たとえ WHERE textcolumn LIKE "%SUBSTRING%"は遅くなります。おそらく、データベースにPHPを処理させるのではなく、データベースに処理させることをお勧めします。他の基準(日付範囲、userなど)を使用すると、部分文字列検索がOK(ish)であることがわかります。

単語全体を検索する場合は、個々の単語をすべて個別のテーブルに引き出し、それを使用して部分文字列検索を制限できます。 (「my search string」を検索する場合、最長の単語「search」を検索すると、単語「search」を含むレコードで部分文字列検索のみが実行されます)

5
Jaydee