提高SQL LIKE查询性能

5
我们有一张包含产品信息的大表格。几乎所有时间我们需要查找包含特定词汇的产品名称,但不幸的是这些查询要花费很长时间才能运行。
例如:查找所有名称包含单词“steel”和“102”(不必紧挨着,所以像“Ninja steel iron 102 x”这样的产品也是匹配项,就像“Dragon steel 102 b”一样)的产品。
目前我们是这样做的: SELECT columns FROM products WHERE name LIKE '%WORD1%' AND name LIKE '%WORD2%' (通常有2-4个like词,但理论上可以是7-8个或更多)。
有更快的方法吗?
我们只匹配单词,因此我想知道是否有办法帮助我们(即在上面的示例中,产品是匹配项,但“Samurai swordsteel 102 v”不是匹配项,因为“steel”不独立存在)。
我的想法是制作一个带有产品名称单词的辅助表,然后使用该表格获取匹配产品的ID。
即:一个类似于[id,word,productid]的表,所以我们得到例如:
1, samurai, 3
2, swordsteel, 3
3, 102, 3
4, v, 3

请问MySQL中是否有内置的方法来实现这个功能,这样我就不必自己实现并维护两个表了。

谢谢!

1个回答

1

抱歉,您的模式名称开头有通配符。因此,MySQL 无法使用标准索引。

您有两个选择。首先,如果这些单词确实是关键字/属性,则应该有另一个表,每个单词一行。

如果不是这种情况,您可以尝试全文索引。请注意,MySQL 对最小单词长度和使用停用词列表等属性进行了设置。在构建索引之前,应考虑这些问题。


谢谢。我们已经有了一个完整的文本索引,但运行查询仍需要5-10秒甚至更长时间。 - Louisa
@Louisa 你是否使用MATCH而不是LIKE来使用全文索引? - Antonín Lejsek
不错的提示,但是当我执行SELECT * FROM products WHERE MATCH(NAME) AGAINST('+word1 +word2 +word3'')时,MATCH返回了太多行 - 我得到了包含所有3个单词的结果,但也得到了只包含1-2个单词的名称的结果。 - Louisa
@Louisa http://stackoverflow.com/questions/15239156/mysql-match-against-with-multiple-values-to-against - Antonín Lejsek
太棒了。谢谢! - Louisa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接