2016-05-22 10 views
5

私たちは製品情報を持つ大きなテーブルを持っています。特定の単語を含む製品名を見つける必要がほとんどありますが、残念ながらこれらのクエリは永遠に実行されます。SQL LIKEクエリのパフォーマンスを改善する

例:名前に「steel」と「102」という単語が含まれているすべての商品を検索します(必ずしも隣り合わせではないため、「Ninja steel iron 102 x」などの商品は「Dragon鋼102b "はそれである)。

SELECT columns FROM products WHERE name LIKE '%WORD1%' AND name LIKE '%WORD2%'(のような単語の数は通常2-4ですが、それは理論的には7-8以上にすることができる):

現在、我々はこのようにそれをやっています。

これを行う方法はありますか?

私はそれがどうにか役立つかどうかは疑問です(つまり、上記の例の製品は一致しますが、「鋼鉄」は単独ではないので "Samurai swordsteel 102 v"は一致しません) 。

私の考えは、productnamesの単語を持つヘルパーテーブルを作成し、そのテーブルを使って一致する製品のIDを取得することです。

すなわち表のように:[ID、単語、商品コード]私たちは、たとえば取得:

1, samurai, 3 
2, swordsteel, 3 
3, 102, 3 
4, v, 3 

ちょうどMySQLの中でこれを行う方法で構築があれば疑問に思うので、私が持っていません私自身のものを実装する+ 2つのテーブルを維持する。

ありがとうございます!

答えて

1

残念ながら、パターン名の冒頭にはワイルドカードがあります。したがって、MySQLは標準インデックスを使用できません。

2つのオプションがあります。まず、単語が実際にキーワード/属性である場合は、単語ごとに1行の別の表が必要です。

そうでない場合は、フルテキストインデックスを試すことができます。 MySQLには最小語長の属性があり、ストップワードリストを使用することに注意してください。インデックスを作成する前にこれらを考慮する必要があります。

+0

ありがとうございました。私たちはすでに全文索引を持っていますが、実行や照会には5〜10秒かかります。 – Louisa

+0

@Louisa全文索引を使用するには、LIKEではなくMATCHを使用しますか? –

+0

良いヒントですが、MATCH(NAME)AGAINST( '+ word1 + word2 + word3' ') - すべての3ワードの結果が得られますが、名前の単語のうちの2つ。 – Louisa

関連する問題