我有一张桌子:物品(id,描述)。在我的程序中,我得到一个单词列表(word1到wordN)作为输入,我需要计算这些单词中有多少出现在表中的每个描述中,并根据该数字对结果进行排序。这是我的解决方案,但我欢迎有关如何提高性能的建议。感谢。
SELECT x, COUNT(*)
FROM (SELECT description as x, id FROM items where description LIKE '%word1%'
UNION ALL
SELECT description as x, id FROM items where description LIKE '%word2%'
UNION ALL
...
UNION ALL
SELECT description as x, id FROM items where description LIKE '%wordN%')
GROUP BY (id)
ORDER BY COUNT(*) DESC
答案 0 :(得分:1)
如果查看执行计划,您可能会看到已经联合在一起的每个SELECT的单独表扫描。当您使用该术语的通配符前缀进行搜索时,这意味着该查询是不可搜索的 - 因此即使描述列上有索引,它也无法使用它,因此扫描也是如此。
通过将条件合并为一个,您可以将此内容仅扫描一次,而不是n次:
SELECT description as x, id
FROM items
WHERE description LIKE '%word1%'
OR description LIKE '%word2%'
OR description LIKE '%wordn%'
运行它应该现在向您展示一个具有单个表扫描的执行计划,以便它在一次扫描中进行匹配。
但是,您的原始查询略有不同,因为它似乎根据项目匹配的条款数量对结果进行排名。因此,出于性能和功能原因,可能值得研究Full Text Search。
答案 1 :(得分:0)
SELECT x, COUNT(*)
FROM (SELECT description as x, id FROM items where description LIKE '%word1%'
or description LIKE '%word2%'
or description LIKE '%wordN%')
GROUP BY (id)
ORDER BY COUNT(*) DESC
这应该更好......