2009-08-09 62 views

回答

11

phpMyAdmin的使用SHOW TABLE STATUS得到您的表的信息。

documentation

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

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

4

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

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

这就是为什么InnoDB的此表统计信息只能近似计算。准确的计数需要扫描所有存储的行,以查看它们是否对当前的事务可见。

相关问题