MySQL数据库对于COUNT(*)的不同处理会造成不同的结果,比如,执行下面查询时,即使对于千万级别的数据mysql也能非常迅速的返回结果。
SELECT COUNT(*) FROM tablename
但如果这样执行, mysql的查询时间开始攀升。
SELECT COUNT(*) FROM tablename WHERE…..
当没有WHERE语句对于整个mysql的表进行count运算的时候,MyISAM类型的表中保存有总的行数,而当添加有WHERE限定语句的时候Mysql需要对整个表进行检索,从而得出count的数值,因此加上where条件的查询速度就会很慢了。
对于MySQL的DISTINCT的关键字的一些用法:
1.在count 不重复的记录的时候能用到,比如SELECT COUNT( DISTINCT id ) FROM tablename;就是计算talbebname表中id不同的记录有多少条。
2,在需要返回记录不同的id的具体值的时候可以用,比如SELECT DISTINCT id FROM tablename;返回talbebname表中不同的id的具体的值。
3.上面的情况2对于需要返回mysql表中2列以上的结果时会有歧义,比如SELECT DISTINCT id, type FROM tablename;实际上返回的是 id与type同时不相同的结果,也就是DISTINCT同时作用了两个字段,必须得id与tyoe都相同的才被排除了,与我们期望的结果不一样。
4.这时候可以考虑使用group_concat函数来进行排除,不过这个mysql函数是在mysql4.1以上才支持的。
5.其实还有另外一种解决方式,就是使用,SELECT id, type, count(DISTINCT id) FROM tablename,虽然这样的返回结果多了一列无用的count数据(或许你就需要这个我说的无用数据),返回的结果是只有id不同的所有结果和上面的4类型可以互补使用,就是看你需要什么样的数据了。
DISTINCT的效率:
SELECT id, type, count(DISTINCT id) FROM tablename
虽然这样的返回结果多了一列无用的count数据(或许你就需要这个我说的无用数据),SELECT id, type from tablename group by id;这样貌似也可以,用distinct的时候,如果它有索引,mysql会把它转成group by的方式执行。
本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉
本文系统来源:php中文网
统计一个按天分区,每天都有百亿条数据条的hive表中ac
count
字段的非重用户数(大概两千万)。后来又更改为按id字段分别统计每个id的用户数。
很简单,直接
count
(
distinct
ac
count
)这个句子。然后写上了一行查询完成!然后等待了四个小时,map反着跑就知道肯定有问题。。
Hive SQL 基于的mapreduce是并行计算,百亿的数据可不是平时测试时的
mysql
里的几百条数据。
这么想来应该是map和
有这样的一个需求:select
count
(
distinct
nick) from user_access_xx_xx;
这条sql用于统计用户访问的uv,由于单表的数据量在10G以上,即使在user_access_xx_xx上加上nick的索引,
通过查看执行计划,也为全索引扫描,sql在执行的时候,会对整个服务器带来抖动;
root@db 09:00:12>select
count
(
distinct
nick) from user_access;
+———————-+
|
count
(d
sql
distinct
详解以及优化
一.
distinct
简介
distinct
这个关键字来过滤掉多余的重复记录只保留一条,但往往只用 它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是
distinct
只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到
效率
的。
下面先来看看例子:
table表
字段1 字段2
id name
1 a
2 b
3 c
4 c
库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。
比如我想用一条
在数据库中,
DISTINCT
和 GROUP BY 都是用来过滤重复数据的,但它们的原理和用法是不同的。
DISTINCT
是通过比较每一行数据,仅返回不重复的数据,因此如果数据量较大,
DISTINCT
的
效率
较低。
GROUP BY 是通过分组,将相同的数据分为一组,并对每一组数据进行计算,因此如果数据量较大,GROUP BY 的
效率
较高。
总的来说,GROUP BY 的
效率
要优于 DISTIN...
如何提升自身sql
效率
,更快得到想要的数据,是每一个使用sql的同学都需要学习和关注的事情。
sql作为面向大众的数据提取工具,除了研发、数据
分析
师,产品经理及业务运营同学也都有应用需求。只要sql无语法错误,保持等待,或长或短都是可以输出结果的。但是在数据量庞大或数据逻辑复杂时,或碰上线上资源紧张,或者好不容易等了3小时、结果发现数据有点异常需要修改后重跑,不知道有没有同学有相同的经历。
低效是每位同学都不乐见的,而避免这个问题就要求我们学习优化sql的方法,从而减少自己等数的焦虑时光。
而其中最常
COUNT
()聚合函数,以及如何优化使用了该函数的查询,很可能是
MySQL
中最容易被误解的前10个话题之一,在网上随便搜索一下就能看到很多错误的理解,可能比我们想象的多得多。
在做优化之前,先来看看
COUNT
()函数的真正作用是什么。
COUNT
()的作用
COUNT
()是一个特殊的函数,有两种非常不同的作用:它可以统计某个列值的数量,也可以统计行数。在统计列值时要求列值非空的(不统计NULL)。如果在
COUNT
()的括号中指定了列或列的表达式,统计的就是这个表达式有值的结果数。因为很多人对NUL..
最近遇到几个客户在HybridDB上做
性能
测试时,都遇到
Count
Distinct
的
性能
调优问题。这里我们总结一下HybridDB中,对
Count
Distinct
的几种处理方式。
我们以一个客户的案例来做说明。客户的典型的业务场景是,在用户行为日志中统计对应类别的行为数,类别有几千个,独立的行为的总量很多,有几千万;为
分析
行为,要查询一段时...
问题:想查询某个表A里面的数据关联的分表B数据,需要查询出A中每条数据中关联了B中多少条数据,还需要查出A关联表C中,每条A关联了多少条C中的数据。我用的是TP框架,当我直接用
count
()查询,关联两个表同时查询的时候会出现查询的数据量不正确的问题,具体原因和执行的顺序有关。最后采用的是
DISTINCT
函数查询,测试没有问题但是线上数据比较多就会出问题。所以优化了一下写法
原来写法:
SELECT
COUNT
(
DISTINCT
C.sexp_id) AS
count
1,