2012-01-24 21 views
2

これは複数の値を一度に検索する最も効率的な方法ですか?複数の値を検索する -

SELECT * 
    FROM `table` 
WHERE ( (title LIKE %search term 1%) 
     OR (description LIKE %search term 1%) 
     OR (title LIKE %search term 2%) 
     OR (description LIKE %search term 2%) 
     OR (title LIKE %search term 3%) 
     OR (description LIKE %search term 3%) 
     OR (title LIKE %search term 4%) 
     OR (description LIKE %search term 4%) 
     OR (title LIKE %search term 5%) 
     OR (description LIKE %search term 5%) 
     ) 
; 
+0

%%は完全なテーブルスキャンを意味しますので、どれだけのORがあるかは関係ありません –

答えて

1

あなたが本当にtitledescriptionのいずれかが、それらの検索語のいずれかが含まれているすべてのレコードを検索する必要がある場合は、そのクエリは、あなたが、例えば、(1)自分のスキーマを再構築のいずれかなしで行うことができますと同じくらい良いですtable_idsearch_termSELECT table.* FROM table JOIN table_search_terms on table.id = table_search_terms.table_id WHERE search_term = 'search term 1' OR ...を書くことができるように)の列を持つtable_search_termsテーブルを追加するか、(2)フルテキスト検索インデックス作成用の特別なツール(Luceneなど)をインストールします。 LIKEではなくINSTRまたはREGEXPを使用するような小さな変更は、クエリの速度を若干上げる(または速度をわずかに低下させる)可能性がありますが、それほど顕著な影響はありません。

1

あなたは、フルテキスト検索に見たいと思うかもしれませんように見えます:あなたのクエリは次のようになり

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

SELECT * FROM table 
WHERE MATCH (title,description) 
AGAINST ('"search term 1" "search term 2" "search term 3" "search term 4" "search term 5"' IN BOOLEAN MODE); 

あなたは、あなたのテーブルの上にフルテキストインデックスを定義することをお勧めしますほとんどの場合、元のクエリよりも速くなります。