https://www.jianshu.com/p/1b0a1f641e80]

不同引擎count(*)实现方式不同

  • MyISAM引擎把一个表的总行数记录在了磁盘上,执行count(*)会直接返回这个数值,效率很高。
  • InnoDB,执行count(*),需要把数据一行行的从引擎中读出来,然后累积计数。

InnoDB对count(*)的优化

  • 我们知道,InnoDB是索引组织表,主键索引的叶子节点保存的是数据;普通索引的叶子节点保存的是主键值。所以,普通索引比主键索引小,对于count(*)这样的操作,遍历哪个索引树得到的结果逻辑上是一样的,因此,MySQL优化器会找到最小的索引树来遍历,在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一。

show table status与count(*)

  • show table status命令输出结果中有一个TABLE_ROW值,但不能代替cout(*),因为它是通过采样统计计算的,误差较大(可能达到40%-50%)。

聚合函数count()

  • count()是一个聚合函数,对于返回结果,一行行的判断,如果count函数的参数不是NULL,累计值就+1,否则不加,最后返回累计值。
  • count(*)、count(id)、count(1)都表示返回满足查询条件的结果集的总行数;count(字段),表示返回满足条件的数据行里面参数字段不为NULL的结果的总个数。

不同count参数性能对比

    • count(主键id):InnoDB引擎会遍历整张表,把每一行id值都取出来,返给server层。server层拿到id后,判断是不可能为空的,就按行累加,不再对每个值进行NULL判断。
    • count(1):InnoDB引擎会遍历整张表,但不取值。server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加,不再对每个值进行NULL判断。
        count(1)比count(主键id)执行的要快,因为从引擎放回id会涉及解析数据行,以及拷贝字段值的操作。
    • count(字段):
        1、如果参数字段定义NOT NULL,判断是不可能为空的,按行累加,不再对每个值进行NULL判断。
        2、如果参数字段定义允许为NULL,那么执行的时候,判断可能是NULL,还要把值取出来再判断一下,不是NULL才累加。
        这也是定义字段时建议设置NOT NULL的原因之一。
    • count(*):前面说过,InnoDB专门对它做了优化
    • 结论:对于InnoDB引擎,按效率排序,count(字段) < count(主键id) < count(1) ≈ count(*),建议尽量使用count(*)

最新文章

  1. MAC OS X的ACL扩展权限设置
  2. C/S架构程序多种类服务器之间实现单点登录(转)
  3. android电视安装爱奇艺等不能看视频问题
  4. ORA-12519, TNS:no appropriate service handler found
  5. Oralce 处理字符串函数
  6. JS同源策略和跨域问题
  7. Dynamic Performance Tables not accessible Automatic Statistics disabled for this session
  8. Visual Studio 2015的安装与基本使用
  9. 使用DataFlow表达ControlFlow的一些思考
  10. eclipse点击空白处自动打开项目
  11. Lambda的使用与实战
  12. [Swift]LeetCode486. 预测赢家 | Predict the Winner
  13. HttpInvoker客户端动态调用Demo
  14. 【转载】ubuntu下/usr/bin和/usr/local/bin的区别
  15. Java高级面试题解析(一)
  16. 20175312 2018-2019-2 《Java程序设计》第1周学习总结
  17. 简单的TSQL基础编程格式,存储过程,视图
  18. [ 测试思维 ] 启发式测试策略模型(HTSM)
  19. PAT 1033 旧键盘打字(20)(20 分)
  20. BoneBlack am335x can0 通讯配置与测试

热门文章

  1. 基于gtk的imshow:用stb_image读取图像并用gtk显示
  2. windows动态库和静态库VS导入
  3. Python_soket
  4. Kubernetes网络之Flannel工作原理
  5. 《构建之法》个人第二次作业之git学习
  6. 洛谷 P2725 邮票题解
  7. php中函数的类型提示和文件读取功能
  8. The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple (Mirror)
  9. hak的使用
  10. sqlserver2005新特性介绍