邹城网站设计,网站建设后期需要后期做的,做网站策划营销推广,公司网站开发费进什么费用一 . count#xff08;*#xff09;的实现方式 MyISAM 引擎把一个表的总行数存在了磁盘上#xff0c;因此执行 count() 的时候会直接返回这个数#xff0c;效率很高#xff1b; 而 InnoDB 引擎就麻烦了#xff0c;它执行 count(*) 的时候#xff0c;需要把数据一行一行…一 . count*的实现方式 MyISAM 引擎把一个表的总行数存在了磁盘上因此执行 count() 的时候会直接返回这个数效率很高 而 InnoDB 引擎就麻烦了它执行 count(*) 的时候需要把数据一行一行地从引擎里面读出来然后累积计数。
二. InnoDB为什么不存储行数
InnoDB是支持事务的默认的隔离级别是可重复读。在代码上就是通过多版本并发控制也就是 MVCC 来实现的。每一行记录都要判断自己是否对这个会话可见因此对于 count(*) 请求来说InnoDB 只好把数据一行一行地读出依次判断可见的行才能够用于计算“基于这个查询”的表的总行数。
三.不同count的用法
对于 count(主键 id) 来说InnoDB 引擎会遍历整张表把每一行的 id 值都取出来返回给 server 层。server 层拿到 id 后判断是不可能为空的就按行累加。
对于 count(1) 来说InnoDB 引擎遍历整张表但不取值。server 层对于返回的每一行放一个数字“1”进去判断是不可能为空的按行累加。
对于 count(字段) 来说如果这个“字段”是定义为 not null 的话一行行地从记录里面读出这个字段判断不能为 null按行累加如果这个“字段”定义允许为 null那么执行的时候判断到有可能是 null还要把值取出来再判断一下不是 null 才累加。
但是count(*是例外并不会把全部字段取出来而是专门做了优化不取值。count(*) 肯定不是 null按行累加。
按照效率排序 count(*) count(1) count(主键) count(字段)