为什么我的InnoDB表有一个奇怪的记录计数值?

时间:2009-08-09 19:16:17

标签: mysql innodb myisam

下面是我的mysql DB中2个表的行数  1是myisam另一个innodb,

有人可以告诉我为什么innodb在这个号码前面有吗?

这些数字来自phpmyadmin

10,308      MyISAM  
~118,011    InnoDB

2 个答案:

答案 0 :(得分:11)

phpMyAdmin使用SHOW TABLE STATUS获取表格信息。

来自documentation

  

     

行数。某些存储引擎(如MyISAM)会存储确切的计数。对于其他存储引擎,例如InnoDB,此值是近似值,并且可能与实际值相差多达40%到50%。在这种情况下,请使用SELECT COUNT(*)来获得准确的计数。

这是因为InnoDB是一个ACID兼容的存储引擎。 InnoDB使用行级MVCC实现locking。简而言之,在给定时间可以存在给定行的多个副本。我建议您阅读这篇文章:Understanding InnoDB MVCC

答案 1 :(得分:4)

因为InnoDB是一个事务存储引擎,所以确切的计数需要解释。例如,某些行可能存在于存储中,但创建这些行的事务尚未提交。因此,行不应包含在计数中。

更令人困惑的是,您的事务可能是REPEATABLE READ隔离级别,这意味着只有在您的事务开始之前提交的行才可见。某些行可能会被提交,但最近会比您的可重复读取事务的开始提交。所以那些行也不应该包含在计数中。但是,相同的行包含在由稍后启动的另一个事务或READ COMMITTED隔离级别中完成的计数中。

这就是InnoDB的这个表统计数据只能近似的原因。准确计数需要扫描所有存储的行,以查看它们是否对当前事务可见。