提高SQL LIKE查询性能

时间:2016-05-22 01:22:55

标签: mysql sql performance sql-like

我们有一张包含产品信息的大表。几乎所有的时间我们都需要找到包含特定单词的产品名称,但不幸的是这些查询需要永远运行。

示例:查找名称中包含单词" steel"的所有产品。和" 102" (不一定是彼此相邻,所以像#Ninja钢铁102 x"这样的产品是匹配的,就像"龙钢102 b"是它。)

目前我们这样做:

SELECT columns FROM products WHERE name LIKE '%WORD1%' AND name LIKE '%WORD2%'(相似单词的数量通常为2-4,但理论上可以是7-8或更多)。

有更快的方法吗?

我们只是匹配单词,所以我想知道这是否有所帮助(例如上面例子中的产品是匹配,但是#34; Samurai swordsteel 102 v"不是匹配,因为" steel& #34;并不孤立。

我自己的想法是使用productnames中的单词创建一个帮助表,然后使用该表来获取匹配产品的ID。

即。一个像:[id,word,productid]的表,所以我们得到例如:

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

只是想知道在MySQL中是否有内置方法可以做到这一点,所以我不必实现自己的东西+维护两个表。

谢谢!

1 个答案:

答案 0 :(得分:1)

不幸的是,你在模式名称的开头有通配符。因此,MySQL无法使用标准索引。

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

如果不是这种情况,您可以尝试全文索引。请注意,MySQL具有最小单词长度的属性,并使用停用词列表。在构建索引之前,您应该考虑这些因素。