4

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

有人能告诉我为什么innodb的数字前面有这个〜吗?

这些数字来自 phpmyadmin

10,308      MyISAM  
~118,011    InnoDB
4

2 回答 2

11

phpMyAdmin 用于SHOW TABLE STATUS获取表的信息。

文档中:

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

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

于 2009-08-09T19:17:58.970 回答
4

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

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

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

于 2009-08-09T19:37:44.123 回答