count(*)为什么这么慢

127 阅读1分钟

count(*)的实现方式

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

1:Myisam引擎把一个表的总行数存在磁盘上,因此执行 count(*)的时候会直接返回这个数,效率高。

2:innodb引擎就很麻烦了,它执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累计计数。

为什么 InnoDB 不跟 MyISAM 一样,也把数字存起来呢?

因为即使在同一个时刻的多个查询,由于多个版本并发控制的原因,innodb表应该返回多少行,也是不确定的。

不用count用法

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

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