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