count(*)的实现方式
你首先要明确的是,在不同的MySQL引擎中,count(*)有不同的实现方式。
-
MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;
-
而InnoDB引擎就麻烦了,它执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。
这里需要注意的是,我们在这篇文章里讨论的是没有过滤条件的count(*),如果加了where 条件的话,MyISAM表也是不能返回得这么快的。
那为什么InnoDB不跟MyISAM一样,也把数字存起来呢?
这是因为即使是在同一个时刻的多个查询,由于多版本并发控制(MVCC)的原因,InnoDB表“应该返回多少行”也是不确定的。这里,我用一个算count(*)的例子来为你解释一下。
假设表t中现在有10000条记录,我们设计了三个用户并行的会话。
-
会话A先启动事务并查询一次表的总行数;
-
会话B启动事务,插入一行后记录后,查询表的总行数;
-
会话C先启动一个单独的语句,插入一行记录后,查询表的总行数。
我们假设从上到下是按照时间顺序执行的,同一行语句是在同一时刻执行的。

会话A、B、C的执行流程
<

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



