在MySQL中获取不同值的最佳方法

时间:2011-04-07 16:05:44

标签: mysql

我有这个问题:

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的帖子,这里,但它们似乎主要与语法相关。我对优化感兴趣,我想知道我是否正在使用正确的工具。

我可以使用中间计数器表来总结整体命中,但我想要一种方法来实现这一点,这样我就可以轻松生成特殊的“范围”查询;也就是说,上周或上个月的访客人数是多少。

1 个答案:

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

尝试一下,让我们知道它是否更快:)