Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在寻找帮助,以加快大型mysql数据库上的count distinct查询_Mysql_Sql - Fatal编程技术网

正在寻找帮助,以加快大型mysql数据库上的count distinct查询

正在寻找帮助,以加快大型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

我一直在寻找优化我的count distinct查询的方法,但没有成功。在我看来,应该有一些简单的解决办法,但我就是没有找到

我有一个表,其中有大量记录。它目前有大约50万条记录,最终将达到数百万条

我目前正试图实时显示3个字段的不同计数,但我的计数不同查询速度非常慢,因此我的结果“滞后”于实际计数

我在网上找到并一直使用的查询有:

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。。