为什么InnoDB会对COUNT(*)进行全面扫描?

时间:2010-10-12 22:04:23

标签: mysql database performance innodb

在一个包含5百万行的表中,SELECT count(*) FROM table在MyISAM中是即时的,但在InnoDB中需要几秒钟。

为什么会这样?为什么他们不像MyISAM那样优化InnoDB中的计数?

感谢。

2 个答案:

答案 0 :(得分:6)

这是实施方面的差异。 InnoDB支持事务,因此它必须根据事务一致的表视图来计算行数。由于MyISAM不支持ACID属性,如果插入了一行,则会为每个人插入一行,因此它只能更新它在存储引擎中保留的计数。

答案 1 :(得分:6)

MyIsam在某处存储了行数,因此查询几乎是即时的,InnoDB必须扫描表以获得完整计数。 如果您有条件计数(例如:“SELECT COUNT(*)WHERE CUSTOMER = 4”)两者都必须进行扫描,这种情况没有太大区别

来源:

http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/