2012-04-10 55 views
0

我有一个表格:items(id,description)。在我的程序中,我输入一个单词列表(word1到wordN),我需要计算这些单词在表格的每个描述中出现的数量,并根据该数字对结果进行排序。这是我的解决方案,但我很乐意就如何提高性能提出建议。谢谢。通过+ order by + count提高工作效率union all + group

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
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 

这应该是更好的... ...

+0

这产生了一个不同的结果集:如果两个单词匹配一个描述原始查询将计数2,而你的计数为1. – APC 2012-04-10 11:22:30

1

如果你看一下执行计划,你可能看到每个你union'd在一起的两个SELECT一个单独的表扫描。由于您正在使用通配符前缀搜索术语,因此这意味着查询是不可测量的 - 因此即使在描述列上有索引,也无法使用它,因此无法扫描。

您可以可以下来,只扫描表一次,而不是n次,通过的条件组合成一个:

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

运行这个现在应该告诉你,有一个表扫描的执行计划所以它在一次扫描中完成匹配。

但是,您的原始查询略有不同,因为它似乎是根据项目匹配项的数量来对结果进行排名。因此,出于性能和功能原因,可能需要查看Full Text Search

+0

+1我认为文本索引是改善这只小狗性能的唯一方法,除非并行查询是一个选项。 – APC 2012-04-10 11:27:12

+0

谢谢。我以前很怕那个。我会看看FTS。 – 2012-04-10 12:28:17