面试必备:聊聊数据库查询统计的count(*)、count(1)、count(column)的区别?
简述:
count(*) 对行的数目进行计算,包含NULL。效率低
count(column) 对特定的列的值具有的行数进行计算,不包含NULL值。效率高
count(1) 这个用法和count(*)的结果是一样的。
扩展:
以mysql为实验
性能问题:
1、任何情况下 SELECT COUNT(*) FROM tablename
是最优选择;
2、尽量减少 SELECT COUNT(*) FROM tablename WHERE COL = 'value'
这种查询;
3、杜绝 SELECT COUNT(COL) FROM tablename WHERE COL2 = 'value'
的出现。
如果表没有主键,那么count(1)
比count(*)
快。
如果有主键,那么count(主键,联合主键)
比count(*)
快。
如果表只有一个字段,count(*)
最快。
count(1)
跟count(主键)
一样,只扫描主键。
count(*)
跟count(非主键)
一样,扫描整个表。
count(*)、count(1)、count(column)执行效率高低比较
count(column) 会忽略为 null 的列,其他两个不会。
执行效率:
它们三个的效率如何呢?网上说的各有各的理,当表中存在索引和主键的时候(我还没接触过设计表时不设计主键的),三者效率差不多。而我在《高性能MySQL》一书中看到这样一段话:
当我们使用 count(*) 时,通配符 * 并不会像我们猜想的那样扩展成所有的列,实际上,它会忽略所有的列而直接统计所有的行数。我们发现最常见的错误就是,在括号内指定一个列却希望统计结果集的行数。如果希望知道的是结果集的行数,最好使用 count(*),这样写意义清晰,性能也会很好。
测试:
我用100万数据进行测试,发现当且仅当三者有主键时,他们的执行时间几乎相等
。
# 有主键:0.139s,无主键:0.283s
select count(*) from shop_order
# 有主键:0.154s,无主键:0.474s
select count(id) from shop_order
# 有主键:0.139s,无主键:0.285s
select count(1) from shop_order
# 有主键但不使用主键:0.383s (count(普通列))
select count(old_id) from shop_order
用75570717条数据进行测试,分别执行两次,测试结果如下:
# 第一次:50.660s 第二次:45.891s
select count(*) from tb_mattress_sleep_raw_data
# 第一次:59.925s 第二次:46.948s
select count(`mattress_id`) from tb_mattress_sleep_raw_data
# 第一次:90.997s 第二次:70.314s
select count(`time_zone`) from tb_mattress_sleep_raw_data
出处:https://www.cnblogs.com/chenmingjun/p/10436316.html
支持小微:
腾讯云 搞活动了?玩服务器的可以搞搞。就这几天时间。
云服务器限时秒杀,1核2G 首年95元!
链接:https://curl.qcloud.com/RX2amrlR
右下角,您点一下在看图片
小微工资涨1毛
商务合作QQ:185601686