我有这个问题:
select count(distinct User_ID) from Web_Request_Log where Added_Timestamp like '20110312%' and User_ID Is Not Null;
将User_ID和Added_Timestamp编入索引。
查询速度很慢(我们有数百万条记录,而且表格增长很快)。
我已经阅读了所有关于count和distinct的帖子,这里,但它们似乎主要与语法相关。我对优化感兴趣,我想知道我是否正在使用正确的工具。
我可以使用中间计数器表来总结整体命中,但我想要一种方法来实现这一点,这样我就可以轻松生成特殊的“范围”查询;也就是说,上周或上个月的访客人数是多少。
答案 0 :(得分:3)
做了一些测试,看看GROUP BY是否有帮助,而且似乎可以。
在表A上,给定的非索引字段有~8M记录和~340K不同记录:
GROUP BY 17 seconds
COUNT(DISTINCT ..) 21 seconds
在表A上,给定索引字段有~2M记录和~50K不同记录:
GROUP BY 200 ms
COUNT(DISTINCT ..) 2.5 seconds
这是带有InnoDB引擎的MySql,BTW。
我找不到任何相关的文档,我想知道这种比较是否依赖于数据(有多少重复)。
对于您的表,GROUP BY查询将如下所示:
SELECT COUNT(t.c)
FROM (SELECT 1 AS c
FROM Web_Request_Log
WHERE Added_Timestamp LIKE '20110312%'
AND User_ID IS NOT NULL
GROUP BY User_ID
) AS t
尝试一下,让我们知道它是否更快:)