不同的 count 用法效率:在 select count(?) from t 这样的查询语句里面,

count(*)、count(主键 id)、count(字段) 和 count(1) 等不同用法的性能,有哪些差别。今天谈到了 count(*) 的性能问题,我就借此机会和你详细说明一下这几种用法的性能差别。需要注意的是,

下面的讨论还是基于 InnoDB 引擎的。

这里,首先你要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。

所以,count(*)、count(主键 id) 和 count(1) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。至于分析性能差别的时候,你可以记住这么几个原则:

server 层要什么就给什么;

InnoDB 只给必要的值;现在的优化器只优化了 count(*) 的语义为“取行数”,其他“显而易见”的优化并没有做。这是什么意思呢?接下来,我们就一个个地来看看。

对于 count(主键 id) 来说,InnoDB 引擎会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断是不可能为空的,就按行累加。

对于 count(1) 来说,InnoDB 引擎遍历整张表,但不取值。server 层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。

单看这两个用法的差别的话,你能对比出来,count(1) 执行得要比 count(主键 id) 快。因为从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。

对于 count(字段) 来说:

1. 如果这个“字段”是定义为 not null 的话,一行行地从记录里面读出这个字段,判断不能为 null,按行累加;

2. 如果这个“字段”定义允许为 null,那么执行的时候,判断到有可能是 null,还要把值取出来再判断一下,不是 null 才累加。也就是前面的第一条原则,server 层要什么字段,InnoDB 就返回什么字段。

但是 count(*) 是例外,并不会把全部字段取出来,而是专门做了优化,不取值。count(*) 肯定不是 null,按行累加。看到这里,你一定会说,优化器就不能自己判断一下吗,主键 id 肯定非空啊,为什么不能按照 count(*) 来处理,多么简单的优化啊。当然,MySQL 专门针对这个语句进行优化,也不是不可以。但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种用法就可以了。

所以结论是:按照效率排序的话,count(字段)<count(主键 id)<count(1)≈count(*),所以我建议你,尽量使用 count(*)。

最新文章

  1. 如何通过自定义注解实现AOP切点定义
  2. 关于“wining attitude”
  3. 自动化测试之python安装
  4. SQL语句like子句中的转义符 [转载]
  5. [转]JS继承的5种实现方式
  6. LWIP_STM32_ENC28J60_NETCONN_UDP(3)
  7. Weblogic jsp页面编译出错,Weblogic jsp编译异常
  8. hadoop cdh5的pig隐式转化(int到betyarray)不行了
  9. 如何破解Excel VBA密码
  10. 剑指offer 13:调整数组顺序使奇数位于偶数前面
  11. SpringBoot 之基础学习篇.
  12. python winpdb远程调试
  13. java 类型转换前先做检查
  14. java8之lambda表达式(2)-方法引用
  15. Unity打包IOS和Android以及之间的交互
  16. http 之 HTTP_X_FORWARDED_FOR
  17. js1:根据标签的Id获取value值
  18. nth-digit
  19. 在notepad++中运行python代码
  20. Installing VirtualBox DKMS in Kali 2.0

热门文章

  1. Java基础00-第一个程序2
  2. lucene 入门简介
  3. Appium -- adb monkey操作(一)
  4. Java多线程(下)
  5. CentOS 7安装Python3 笔记
  6. 完整的URL是怎样的?
  7. Linux中tomcat随服务器自启动的设置方法
  8. odoo14在列表视图里添加自定义按钮
  9. python中的生成器,迭代器及列表生成式
  10. noi linux 2.0 体验