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

Moh*_*ari 26 mysql phpmyadmin

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

是什么导致这个?

在此输入图像描述

在此输入图像描述

Server version: 5.1.63-cll
Engine: InnoDB
Run Code Online (Sandbox Code Playgroud)

dre*_*010 48

与MyISAM表不同,InnoDB表不跟踪表包含的行数.

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

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

以下是Percona 关于InnoDB表COUNT(*)的信息博客文章.

SHOW TABLE STATUS的MySQL手册页指出:

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

有关InnoDB限制的页面更详细:

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

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

  • 等待重要的一点是**怎么**`SHOW TABLE STATUS`做它的估计? (9认同)

SCC*_*SCC 5

phpMyAdmin使用快速方法来获取行计数,并且此方法仅返回InnoDB表的大致计数.

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