mysql - 在 MySQL 中获取不同值计数的最佳方法

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

我可以使用中间计数器表来总结总体点击量,但我希望有一种方法可以让我轻松生成临时“范围”查询;即上周或上个月的独立访客数量是多少。

最佳答案

做了一些测试来看看 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/

相关文章:

mysql - Perl/DBIx::Class::Schema::Loader 后缀 _2 以复制关系名称

c# - 在 C# 中使用 select 语句动态创建 CSV 文件

php - 使用php错误列出和删除mysql中的记录

php - 从具有错误字符集的 MySQL 列中抢救希伯来语

php - 在 MySQL 和 PHP 中处理货币时如何处理精度

php - 如何更改php中的时区?

php - MySQL 按 ID 分组并按 MIN(价格)排序

php - 如何使用 PHP 在不同的数据库中创建 MySQL 表结构

php - 如何用mysql查询连接两个表?

MySQL 8 - 表达式中的用户变量已被弃用(复杂计算)