如果没有对数据库进行任何更改,我的表上会有非常不同的行数。
导致这种情况的原因是什么?
Server version: 5.1.63-cll
Engine: InnoDB
答案 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']
,但这可能会对性能产生严重影响。