0

我有一张桌子:物品(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
4

2 回答 2

1

如果您查看执行计划,您可能会看到对您联合在一起的每个 SELECT 进行单独的表扫描。当您使用该术语的通配符前缀进行搜索时,这意味着该查询是不可搜索的 - 因此即使描述列上有索引,它也无法使用它,因此会进行扫描。

通过将条件组合为一个,您可以将其缩小为只扫描一次表,而不是 n 次:

SELECT description as x, id 
FROM items 
WHERE description LIKE '%word1%'
    OR description LIKE '%word2%'
    OR description LIKE '%wordn%'

运行它现在应该向您展示一个带有单个表扫描的执行计划,因此它在一次扫描中完成所有匹配。

但是,您的原始查询略有不同,因为它似乎根据项目匹配的这些术语的数量对结果进行排名。因此,出于性能和功能的原因,可能值得研究全文搜索。

于 2012-04-10T11:12:05.947 回答
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

这个应该更好...

于 2012-04-10T11:06:46.257 回答