为什么在phpmyadmin结果中估计的行数非常不同?

时间:2012-08-12 22:13:16

标签: mysql phpmyadmin

如果没有对数据库进行任何更改,我的表上会有非常不同的行数。

导致这种情况的原因是什么?

enter image description here

enter image description here

Server version: 5.1.63-cll
Engine: InnoDB

2 个答案:

答案 0 :(得分:45)

与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”

答案 1 :(得分:5)

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

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