下面是我的mysql DB中2个表的行数 1是myisam另一个innodb,
有人可以告诉我为什么innodb在这个号码前面有〜吗?
这些数字来自phpmyadmin
10,308 MyISAM
~118,011 InnoDB
答案 0 :(得分:11)
phpMyAdmin使用SHOW TABLE STATUS
获取表格信息。
行
行数。某些存储引擎(如MyISAM)会存储确切的计数。对于其他存储引擎,例如InnoDB,此值是近似值,并且可能与实际值相差多达40%到50%。在这种情况下,请使用SELECT COUNT(*)来获得准确的计数。
这是因为InnoDB是一个ACID兼容的存储引擎。 InnoDB使用行级MVCC实现locking。简而言之,在给定时间可以存在给定行的多个副本。我建议您阅读这篇文章:Understanding InnoDB MVCC。
答案 1 :(得分:4)
因为InnoDB是一个事务存储引擎,所以确切的计数需要解释。例如,某些行可能存在于存储中,但创建这些行的事务尚未提交。因此,行不应包含在计数中。
更令人困惑的是,您的事务可能是REPEATABLE READ
隔离级别,这意味着只有在您的事务开始之前提交的行才可见。某些行可能会被提交,但最近会比您的可重复读取事务的开始提交。所以那些行也不应该包含在计数中。但是,相同的行包含在由稍后启动的另一个事务或READ COMMITTED
隔离级别中完成的计数中。
这就是InnoDB的这个表统计数据只能近似的原因。准确计数需要扫描所有存储的行,以查看它们是否对当前事务可见。