MySQL 的COUNT(x)性能怎么样?

栏目: 数据库 · 发布时间: 7年前

内容简介:innodb引擎会遍历整张表,把每一行的id值都取出来,返回给server层,server层判断id值不为空,就按行累加如果这个字段定义为not null,一行行的从记录里面读出这个字段,判断不为空,则累加值如果这个字段定义允许为null,那么执行的时候,判断到有可能为null,还要把值取出来在判断一下,不是null才累加

对于count(主键id)来说

innodb引擎会遍历整张表,把每一行的id值都取出来,返回给server层,server层判断id值不为空,就按行累加

对于count(字段)来说

如果这个字段定义为not null,一行行的从记录里面读出这个字段,判断不为空,则累加值

如果这个字段定义允许为null,那么执行的时候,判断到有可能为null,还要把值取出来在判断一下,不是null才累加

对于count(1)来说

innodb引擎遍历整张表,但不取值,返回给server层,server对于返回的每一行,放一个数字1进去,判断是不可能为空的,就按行累加

对于count(*)

并不会把全部字段取出来,而是专门做了优化,不取值,count(*)肯定不是null,按行累加

1 总结

如果你要统计行数就用 count(*) 或者 count(1) ,推荐前者

如果要统计某个字段不为NULL值的个数就用 count(字段)

在《**高性能MySQL》**中有如下:

  1. 当 mysql 确认括号内的表达式值不可能为空时,实际上就是在统计行数

  2. 如果mysql知道某列col不可能为NULL值,那么mysql内部会将count(col)表达式优化为count(*)

也就是说count(主键字段)和count(1)还是要优化到count(*)的。

在 MySQL 5.7 Reference Manual 的官方手册中: dev.mysql.com/doc/refman/…

有这么一段:

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

翻译: InnoDB以相同的方式处理SELECT COUNT(*)和SELECT COUNT(1)操作。没有性能差异。

所以这几个按照效率 排序 的话,count(字段)<count(主键id)<count(1)≈count(*)

所以,尽量使用count(*)

2 拓展

在阿里巴巴的 Mysql数据库 >> ( 三) ) SQL

MySQL 的COUNT(x)性能怎么样?

谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!

不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

愿你我在人生的路上能都变成最好的自己,能够成为一个独挡一面的人

MySQL 的COUNT(x)性能怎么样?

© 每天都在变得更好的阿飞云


以上所述就是小编给大家介绍的《MySQL 的COUNT(x)性能怎么样?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

React Native开发指南

React Native开发指南

[美]艾森曼 / 黄为伟 / 人民邮电出版社 / 2016-6-1 / CNY 59.00

本书通过丰富的示例和详细的讲解,介绍了React Native这款JavaScript框架。在React Native中利用现有的JavaScript和React知识,就可以开发和部署功能完备的、真正原生的移动应用,并同时支持iOS与Android平台。除了框架本身的概念讲解之外,本书还讨论了如何使用第三方库,以及如何编写自己的Java或Objective-C的React Native扩展。一起来看看 《React Native开发指南》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试