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

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

内容简介: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)性能怎么样?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Where Wizards Stay Up Late

Where Wizards Stay Up Late

Katie Hafner / Simon & Schuster / 1998-1-21 / USD 16.00

Twenty five years ago, it didn't exist. Today, twenty million people worldwide are surfing the Net. "Where Wizards Stay Up Late" is the exciting story of the pioneers responsible for creating the most......一起来看看 《Where Wizards Stay Up Late》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器