不同的count用法

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

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

所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),则表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。

至于分析性能差别的时候,你可以记住这么几个原则:

  1. server层要什么就给什么;
  2. InnoDB只给必要的值;
  3. 现在的优化器只优化了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(*) 。

不同的count用法相关推荐

  1. MySQL笔记7:sum和count用法总结

    MySQL中sum和count用法总结 1.sum (1)sum()函数里面的参数是列名的时候,是计算列名的值的相加,而不是有值项的总数. (2)sum(条件表达式),如果记录满足条件表达式就加1,统 ...

  2. Python语言学习之字母C开头函数使用集锦:count用法之详细攻略

    Python语言学习之字母C开头函数使用集锦:count用法之详细攻略 count用法 list.count函数的用法 list=['America', 'America', '山东', '山东', ...

  3. boost::hana::count用法的测试程序

    boost::hana::count用法的测试程序 实现功能 C++实现代码 实现功能 boost::hana::count用法的测试程序 C++实现代码 #include <boost/han ...

  4. boost::histogram::accumulators::count用法的测试程序

    boost::histogram::accumulators::count用法的测试程序 实现功能 C++实现代码 实现功能 boost::histogram::accumulators::count ...

  5. boost::fusion::count用法的测试程序

    boost::fusion::count用法的测试程序 实现功能 C++实现代码 实现功能 boost::fusion::count用法的测试程序 C++实现代码 #include <boost ...

  6. MySQL中sum和count用法总结

    MySQL中sum和count用法总结 1.sum 2.count 例子:要求:查询出2门及2门以上不及格者的平均成绩. 3.MySQL 分组之后如何统计记录条数 gourp by 之后的 count ...

  7. count在python中的作用,Python中这个count用法是啥

    Python中这个count用法是啥意思 count 在这里只是一个变量名,你把它换成adict就很好理解了:关于python的一段代码,谁给具体解析一下,特别是 count+=number,在下初中 ...

  8. sql count用法_SQL常用知识点解析

    1.inner join.left join.right join.full outer join.union.union all的区别 inner join.left join.right join ...

  9. mysql count() 写法,MySQL COUNT()用法及代碼示例

    COUNT()功能: MySQL中的此函數用於查找從所選查詢返回的索引數. 特征: 此函數用於查找從所選查詢返回的索引數. 此功能在數字功能下. 此函數僅接受一個參數,即表達式. 此函數將忽略NULL ...

  10. sql count用法_SQL是一门手艺

    SQL不是一门语言,而是一门手艺. 把SQL当手艺来学 1.行列过滤 2.数据变换 3.合并连接 4.聚合透视 奇怪的用法 把SQL当手艺来学 所谓手艺,要求心手相连,每一门手艺的背后,都闪现着手艺人 ...

最新文章

  1. SQLSERVER2014中的新功能
  2. 使用Docker for Windows初体验
  3. 软件开发人员需要的不仅是技术,也不是文档,也不是管理,而是……
  4. php签名墙代码,我们是一家人(签名墙)
  5. [TJOI2009] 战争游戏
  6. CentOS7下安装MySQL5.7安装与配置(YUM)
  7. Requests上传文件
  8. c#和python_C#学习笔记(与Java、C、C++和Python对比)
  9. 桌面上计算机图标怎么改成中文,怎么修改电脑桌面上的图标
  10. 什么是Bugly?Android热更新的初讲解
  11. RabbitMQ的两种不同写法
  12. 货币等额换算_换算单位和货币的最佳免费程序和网站
  13. uni-app第三方sdk集成
  14. 我用Python+PySide6做了个图形化番茄钟,这下可以提醒自己放松一下了。
  15. 【VBA】Excel根据指定字段自动分页sheet功能的实现
  16. 为什么U盘中的文件夹和文件全部变成了快捷方式?
  17. iOS 使用 Fastlane 打包上传 App 到蒲公英
  18. KeyDown、KeyUp、KeyPress区别
  19. TCHAR和CHAR类型的互转
  20. 3DMAX快速入门 界面介绍【上】

热门文章

  1. java格林威治时间转北京时间
  2. 关于严格模式的简单介绍
  3. 计算机专业高级职称评定条件,计算机高级工程师职称评定条件
  4. 2022CVPR云分享 | 清华大学刘烨斌老师实验室四位讲者带你走进计算机视觉领域顶会...
  5. 修正牛顿法及其matlab实现
  6. XSS过滤绕过总结_xss绕过字符过滤
  7. amd625和mx250比较_笔记本电脑中的1050ti与mx250哪个显卡的性能比较好一些?
  8. java游戏征途2008_醉剑逍遥-征途天下
  9. MySQLworkbench中PK,NN,UQ意思详解
  10. 【7gyy】高手分享辨别电脑病毒技巧