mysql之count(*)

在不同的 MySQL 引擎中,count(*) 有不同的实现方式。

  • MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;即没有where条件的过滤情况下,直接返回总数。
  • 而 InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

对于 count(字段) 来说:

  • 如果这个“字段”是定义为 not null 的话,一行行地从记录里面读出这个字段,判断不能为 null,按行累加;
  • 如果这个“字段”定义允许为 null,那么执行的时候,判断到有可能是 null,还要把值取出来再判断一下,不是 null 才累加。
  • count(*)是例外,并不会把全部字段取出来,而是专门做了优化,不取值。count(*) 肯定不是 null,按行累加。

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

InnoDB的总行数,统计结果显示:


image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • select count(*)应该是一个比较常用的语句,用来统计记录行数。 但是,慢慢地你会发现,这个语句越来越慢...
    Boston199834阅读 15,766评论 4 81
  • count(*) 的实现方式 在没有过滤条件的 count()下,在不同的 MySQL 引擎中,count() 有...
    kyo1992阅读 1,504评论 0 0
  • 原文《MySQL实战45讲》 count(*)的实现方式 在MySQL中,不用的引擎对count(*)有不同的实现...
    灰气球阅读 4,241评论 0 0
  • count(*)、count(1)、count(主键)、count(字段)的执行效率 在没有where条件的情况下...
    yingjunchen阅读 2,828评论 0 1
  • 不同引擎count(*)实现方式不同 MyISAM引擎把一个表的总行数记录在了磁盘上,执行count(*)会直接返...
    慧鑫coming阅读 5,712评论 0 1

友情链接更多精彩内容