统计一张表的总数量,是我们开发中常有的业务需求,通常情况下,我们都是使用 select count(*) from t
SQL 语句来完成。随着业务数据的增加,你会发现这条语句执行的速度越来越慢,为什么它会变慢呢?
为什么会变慢?想要得到答案就需要知道 MySQL 是如何统计总数量的,先说一个前提吧,count(*)
的具体实现是由存储引擎实现的,也就是说不同的存储引擎实现的方式不一样。标题:为什么select count( * ) from t
,在 InnoDB 引擎中比 MyISAM 慢?也是高频面试题。
InnoDB和MyISAM 是我们常用的 MySQL 存储引擎,所以主要对比一下 count(*)
在 InnoDB 和 MyISAM 中的实现:
- 在 MyISAM 存储引擎中,把表的总行数存储在磁盘上,当执行 select count(*) from t 时,直接返回总数据。
- 在 InnoDB 存储引擎中,跟 MyISAM 不一样,没有将总行数存储在磁盘上,当执行 select count(*) from t 时,会先把数据读出来,一行一行的累加,最后返回总数量。
知道了 InnoDB 和 MyISAM 引擎 count(*) 实现之后,为什么select count(*) from t
,在 InnoDB 引擎中比 MyISAM 慢?应该有答案了吧,但是这个结论需要有一个前提,就是统计 SQL 不带过滤条件。如果 统计数量 SQL 语句为: