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