我有这个查询:
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 的帖子,但它们似乎主要与语法相关。我对优化很感兴趣,想知道我是否使用了正确的工具来完成这项工作。
我可以使用中间计数器表来总结总体点击量,但我希望有一种方法可以让我轻松生成临时“范围”查询;即上周或上个月的独立访客数量是多少。
最佳答案
做了一些测试来看看 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,顺便说一句。
但我找不到任何相关文档,我想知道这种比较是否取决于数据(有多少重复项)。
对于您的表,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
尝试一下,让我们知道是否更快:)
关于mysql - 在 MySQL 中获取不同值计数的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5584093/