私たちは製品情報を持つ大きなテーブルを持っています。特定の単語を含む製品名を見つける必要がほとんどありますが、残念ながらこれらのクエリは永遠に実行されます。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つのテーブルを維持する。
ありがとうございます!
ありがとうございました。私たちはすでに全文索引を持っていますが、実行や照会には5〜10秒かかります。 – Louisa
@Louisa全文索引を使用するには、LIKEではなくMATCHを使用しますか? –
良いヒントですが、MATCH(NAME)AGAINST( '+ word1 + word2 + word3' ') - すべての3ワードの結果が得られますが、名前の単語のうちの2つ。 – Louisa