我们有一个包含产品信息的大表。几乎所有时候我们都需要查找包含特定单词的产品名称,但不幸的是,这些查询需要永远运行。
示例:查找名称中包含单词“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,但理论上可以是 7- 8 个或更多)。
有没有更快的方法?
我们只是匹配单词,所以我想知道这是否能以某种方式提供帮助(即上面示例中的产品是匹配项,但“Samurai swordsteel 102 v”不是匹配项,因为“钢”不是单独存在的)。
我自己的想法是用 productnames 中的单词制作一个辅助表,然后使用该表获取匹配产品的 ID。
即一个像这样的表:[id, word, productid] 所以我们得到例如:
1, samurai, 3
2, swordsteel, 3
3, 102, 3
4, v, 3
只是想知道在 MySQL 中是否有内置的方法来执行此操作,因此我不必实现自己的东西 + 维护两个表。
谢谢!
最佳答案
不幸的是,模式名称的开头有通配符。因此,MySQL 不能为此使用标准索引。
您有两个选择。首先,如果这些词确实是关键字/属性,那么您应该有另一个表,每个词一行。
如果不是这样,您可以尝试全文索引。请注意,MySQL 具有最小单词长度的属性,并使用停用词列表。在构建索引之前,您应该考虑这些因素。
关于mysql - 提高 SQL LIKE 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37369639/