2017-09-14 16 views
0


これは冗長な質問のようですが、私はこの問題の正解を見つけることができません。
私は50以上の列を持つTableAを持っています。私はこのテーブルの約10列のクエリを検索するための検索機能を実装しています。テーブルAには100万以上の行が含まれています
このため、これらの10個の列に複合インデックスを作成しました。
index (col1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10)
私はスペースを使って正規表現としてユーザーのクエリを分割しています。すなわち
$search_words = $search_query.split(' ');
と、個々の単語を使用して検索クエリを照合します。例:
検索クエリを最適化する

SELECT something FROM tableA 
WHERE (MATCH (col_1, col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10) 
AGAINST (' +word1* +word2* +word3* +word4* ' IN BOOLEAN MODE)) 

このクエリは、一般的な検索のために正常に動作しますが、 A E I O(株)のようなクエリ内の個々のアルファベットのためのユーザーの検索がそれはあまりにも多くの時間がかかる場合。この状況で検索を実行するためのクエリや別の方法を最適化する最良の方法は何ですか?

+0

などです。 myisamの全文検索のために単一の文字を検索させてはいけません。 'ft_min_word_len'を2に調整すると、より良い全文検索が実行されます。それが本当に必要な場合は、「sphinxse」や「elasticsearch」などの検索エンジンの使用を検討する必要があります。 MySQLはそれをとてもうまく扱えません。 – abeyaz

+0

コード内のシンボルの数を最小にします。 なぜ他のテーブルにデータを分割しないのですか? は本当にたくさんの列にこれらすべてを保持する必要があります。 私は3列のテーブルを作成します id、pointer_to_item_or_product、search_word 検索で何らかの系列が必要ですか? –

+0

@abeyazは、有効な検索であり、lucene、elasticsearchなどの検索エンジンを使用することは許可されていないため、検索を制限することはできません。しかし、それまでこの機能を向上させる必要があります。 – Gaur93

答えて

0

あまりにも短い文字列をInnoDBのFULLTEXTに供給すると、結果はゼロになります。 so ... innodb_ft_min_token_sizeより短い文字列をすべて除外します。

REGEXP '[[:<:]]A[[:>:]]を使用して別途テストして、1文字の単語Aを探します。

または一緒に投げます。これは、唯一の1文字の英単語をチェックするでしょう:REGEXP '[[:<:]][AI][[:>:]]