ユーザーがフォームを送信するたびにHTML TEXTAREAをODBCデータベースに保存する場合、1を取得するSELECT
ステートメントとは何ですか1)指定された部分文字列2を含むすべての行)しないすべての行(検索で大文字と小文字が区別されますか?)
編集:if LIKE "%SUBSTRING%"
は遅くなります。すべてを取得してPHPで整理する方が良いでしょうか。
さて、いつでも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
を使用してパフォーマンスを確認してください。
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」を含むレコードで部分文字列検索のみが実行されます)