正在寻找帮助,以加快大型mysql数据库上的count distinct查询
我一直在寻找优化我的count distinct查询的方法,但没有成功。在我看来,应该有一些简单的解决办法,但我就是没有找到 我有一个表,其中有大量记录。它目前有大约50万条记录,最终将达到数百万条 我目前正试图实时显示3个字段的不同计数,但我的计数不同查询速度非常慢,因此我的结果“滞后”于实际计数 我在网上找到并一直使用的查询有:正在寻找帮助,以加快大型mysql数据库上的count distinct查询,mysql,sql,Mysql,Sql,我一直在寻找优化我的count distinct查询的方法,但没有成功。在我看来,应该有一些简单的解决办法,但我就是没有找到 我有一个表,其中有大量记录。它目前有大约50万条记录,最终将达到数百万条 我目前正试图实时显示3个字段的不同计数,但我的计数不同查询速度非常慢,因此我的结果“滞后”于实际计数 我在网上找到并一直使用的查询有: select count(*) from (select distinct c1, c2 from table where c3 >= '2018-04-05
select count(*) from (select distinct c1, c2 from table
where c3 >= '2018-04-05 00:00:00') as count;
select count(distinct c1, c2) from table where c3 >= '2018-04-05 00:00:00';
每个查询都需要3秒钟才能运行,但我需要它尽可能快
我有没有办法做到这一点
干杯
编辑:值得注意的是,我已经为这些列编制了索引,但它只缩短了查询时间约1秒 以下是系统的输出:
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
-- ----------- ---------- ---------- ---- ------------- ---- ------- ---- ------ -------- ---------------
1 PRIMARY <derived2> NULL ALL NULL NULL NULL NULL 503560 100.0 NULL
2 DERIVED TABLE NULL ALL NULL NULL NULL NULL 503560 100.0 Using temporary
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
-- ----------- --------- ---------- ---- ------------- ---- ------- ---- ------ -------- -----
1 SIMPLE TABLE NULL ALL NULL NULL NULL NULL 503562 100.0 NULL
id选择\u类型表分区类型可能的\u键键\u len ref行过滤额外
-- ----------- ---------- ---------- ---- ------------- ---- ------- ---- ------ -------- ---------------
1主NULL所有NULL NULL 503560 100.0 NULL
2使用临时变量的派生表NULL ALL NULL 503560 100.0
id选择\u类型表分区类型可能的\u键\u列参考行过滤额外
-- ----------- --------- ---------- ---- ------------- ---- ------- ---- ------ -------- -----
1个简单表空所有空503562 100.0空
尝试按分组,而不是按不同分组。当您有大量记录时,Distinct的成本很高,因为DB会在查找count之前对结果集进行排序
select count(*) from (select c1, c2 from table group by c1,c2
where c3 >= '2018-04-05 00:00:00') as count;
使用索引
(c3、c1、c2)
“编辑:值得注意的是,我已经为列编制了索引,但它只缩短了查询时间~1秒。”显示两个查询的输出Show CREATE TABLE[TABLE]
和EXPLAIN[query]
,我已经在表上有了该索引,我错误地把它从原来的帖子中漏掉了,但后来我编辑了它。谢谢。我已经分别为查询添加了输出。是否结束show create表?因为解释告诉我没有可能的键,“当您有大量记录时,Distinct是昂贵的,因为DB在查找count之前对结果集进行排序。”MySQL中的GROUP BY有一个自动的ORDER BY。。。DISTINCT没有这个。。所以你的回答没有意义。谢谢你的回答!不幸的是,我已经尝试过了,速度几乎是原来的两倍。@RaymondNijland:-如果您已经使用了.GROUP BY,您可以引用MySQL文档并共享链接吗?但是,您仍然可以控制排序顺序。默认情况下,MySQL中的GROUP BY隐式排序结果(在没有ASC或DESC指示符的情况下)。但是,不推荐使用MySQL中的隐式分组排序。要实现分组结果的特定排序顺序:“->source。。