【问题标题】:Why is the estimated rows count very different in phpmyadmin results?为什么 phpmyadmin 结果中的估计行数有很大不同?
【发布时间】:2012-08-09 04:58:49
【问题描述】:

在没有对数据库进行任何更改的情况下,我的表中的行数非常不同。

这是什么原因造成的?

Server version: 5.1.63-cll
Engine: InnoDB

【问题讨论】:

    标签: mysql phpmyadmin


    【解决方案1】:

    与 MyISAM 表不同,InnoDB 表不跟踪该表包含多少行。

    因此,了解 InnoDB 表中确切行数的唯一方法是检查表中的每一行并累积计数。因此,在大型 InnoDB 表上,执行 SELECT COUNT(*) FROM innodb_table 查询可能会非常慢,因为它会执行全表扫描以获取行数。

    phpMyAdmin 使用类似SHOW TABLE STATUS 的查询从引擎 (InnoDB) 中获取表中行数的估计计数。由于它只是一个估计值,因此每次调用它都会有所不同,有时差异可能相当大,有时它们很接近。

    这是 Percona 撰写的关于 COUNT(*) for InnoDB tables 的内容丰富的博文。

    SHOW TABLE STATUS 的 MySQL 手册页指出:

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

    InnoDB restrictions 上的页面更详细:

    SHOW TABLE STATUS 不提供有关 InnoDB 表的准确统计信息,但表保留的物理大小除外。行数只是 SQL 优化中使用的粗略估计。

    InnoDB 不保留表中的内部行数,因为 并发事务可能“看到”不同数量的行 同时。为了处理SELECT COUNT(*) FROM t 语句,InnoDB 扫描 表的索引,如果索引不存在则需要一些时间 完全在缓冲池中。如果您的餐桌不经常更换, 使用 MySQL 查询缓存是一个很好的解决方案。为了快速计数, 您必须使用自己创建的柜台并让您的 应用程序根据插入更新它并删除它。如果 大概的行数就足够了,可以使用SHOW TABLE STATUS。 请参阅第 14.3.14.1 节,“InnoDB Performance Tuning Tips”

    【讨论】:

    • 等待重点是如何 SHOW TABLE STATUS 进行估算?
    • 但是 phpmyadmin GUI 可以有一个用于精确计数的快捷按钮:SELECT COUNT(*) FROM 'my_table'
    • 我也遇到了这个问题。即运行SELECT COUNT(*) FROM table_name`` 返回一个与在 InnoDB 中返回表视图时显示的值不同的值。 PhpMyAdmin 中是否有用于实际计数的快捷方式?
    【解决方案2】:

    phpMyAdmin 使用快速方法来获取行数,并且此方法仅在 InnoDB 表的情况下返回近似计数。

    请参阅$cfg['MaxExactCount'] 了解修改这些结果的方法,但这可能会对性能产生严重影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 2017-09-28
      相关资源
      最近更新 更多