【问题标题】:Why does my InnoDB table have a weird value for record count?为什么我的 InnoDB 表的记录计数值很奇怪?
【发布时间】:2010-11-18 03:07:29
【问题描述】:

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

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

这些数字来自 phpmyadmin

10,308      MyISAM  
~118,011    InnoDB

【问题讨论】:

    标签: mysql innodb myisam


    【解决方案1】:

    phpMyAdmin 使用SHOW TABLE STATUS 获取表信息。

    来自documentation

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-05
        • 2021-10-11
        • 2018-09-09
        • 2014-07-03
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 1970-01-01
        相关资源
        最近更新 更多