面试必备:聊聊Mysql的count(*)countcount(column)的区别?

Posted androidstarjack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试必备:聊聊Mysql的count(*)countcount(column)的区别?相关的知识,希望对你有一定的参考价值。

点击上方蓝色“终端研发部”,选择“设为星标”

学最好的别人,做最好的我们 

出处:https://www.cnblogs.com/chenmingjun/p/10436316.html

简述:

 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
BAT等大厂Java面试经验总结 想获取 Java大厂面试题学习资料扫下方二维码回复「BAT」就好了回复 【加群】获取github掘金交流群回复 【电子书】获取2020电子书教程回复 【C】获取全套C语言学习知识手册回复 【Java】获取java相关的视频教程和资料回复 【爬虫】获取SpringCloud相关多的学习资料回复 【Python】即可获得Python基础到进阶的学习教程回复 【idea破解】即可获得intellij idea相关的破解教程关注我gitHub掘金,每天发掘一篇好项目,学习技术不迷路!



回复 【idea激活】即可获得idea的激活方式
回复 【Java】获取java相关的视频教程和资料
回复 【SpringCloud】获取SpringCloud相关多的学习资料
回复 【python】获取全套0基础Python知识手册
回复 【2020】获取2020java相关面试题教程
回复 【加群】即可加入终端研发部相关的技术交流群
阅读更多
为什么HTTPS是安全的
因为BitMap,白白搭进去8台服务器...
《某厂内部SQL大全 》.PDF
字节跳动一面:i++ 是线程安全的吗?
大家好,欢迎加我微信,很高兴认识你!
在华为鸿蒙 OS 上尝鲜,我的第一个“hello world”,起飞!

相信自己,没有做不到的,只有想不到的在这里获得的不仅仅是技术!



就给个“在看”

以上是关于面试必备:聊聊Mysql的count(*)countcount(column)的区别?的主要内容,如果未能解决你的问题,请参考以下文章

面试必备:聊聊数据库查询统计的count(*)countcount(column)的区别?

面试必备:虾皮服务端15连问

面试必备:虾皮服务端15连问

面试必备:虾皮服务端15连问

吊打面试官,聊聊:强引用软引用弱引用虚引用? 重点是 各自的 使用场景?(史上最全)

面试必备:虾皮服务端N连问