High Performance MySQL笔记:count

本文详细解释了SQL中count(*)与count(column_name)的区别及应用场景,前者统计所有行数,后者仅统计指定列非NULL值的行数。此外还介绍了count()函数配合表达式使用的技巧,并说明了MyISAM引擎如何优化count(*)的执行效率。

在SQL中使用count()好像是非常自然的事情:

SELECT COUNT(*) FROM TABLE_NAME;

有时候确实会想过,count(*)和单独的count(column_name)有什么区别,会不会后者效率更好(太拿衣服。。。),不过一直没有去追究。

Chapter 6:Query Perfomance Optimization中专门有一节讲了count

count(column_name):只会计算该column上非NULL的行数,这个行为和其他聚集函数一样(SUM会忽略NULL的行)

count(*):就是统计行数

 

其实count()里面是可以放入表达式的(或者说上述两种情况就是两类特殊的表达式):

SELECT COUNT(IF(hbase_app_id is NULL, 1, NULL)) FROM im_task;

此时count得到的就是该列上为null的行数了,再如一个文中的例子:

SELECT COUNT(color = 'blue' OR NULL) AS blue, COUNT(color = 'red' OR NULL) AS red FROM items;

 注意:

count(NULL) = 0, 其他非NULL的表达式都算做1(对于每一行来说)

(SELECT 'COUNT(0)' AS count_type, 	COUNT(0) as value)
UNION
(SELECT 'COUNT(1)', 			COUNT(1))
UNION
(SELECT 'COUNT(NULL)', 			COUNT(NULL))

返回结果如下:

count_type,      value
COUNT(0),       1
COUNT(1),       1
COUNT(NULL),    0

 

文中也对MyISAM引擎对count执行速度进行了解释:

因为MyISAM引擎内部存储了表的确切行数,所以当count(*)时不带有其他的可以筛选行的条件,就直接使用引擎提供的数值了

 

转载于:https://www.cnblogs.com/lailailai/p/4226737.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值