【发布时间】:2012-08-09 04:58:49
【问题描述】:
在没有对数据库进行任何更改的情况下,我的表中的行数非常不同。
这是什么原因造成的?
Server version: 5.1.63-cll
Engine: InnoDB
【问题讨论】:
标签: mysql phpmyadmin
在没有对数据库进行任何更改的情况下,我的表中的行数非常不同。
这是什么原因造成的?
Server version: 5.1.63-cll
Engine: InnoDB
【问题讨论】:
标签: mysql phpmyadmin
与 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 进行估算?
SELECT COUNT(*) FROM 'my_table'
SELECT COUNT(*) FROM table_name`` 返回一个与在 InnoDB 中返回表视图时显示的值不同的值。 PhpMyAdmin 中是否有用于实际计数的快捷方式?
phpMyAdmin 使用快速方法来获取行数,并且此方法仅在 InnoDB 表的情况下返回近似计数。
请参阅$cfg['MaxExactCount'] 了解修改这些结果的方法,但这可能会对性能产生严重影响。
【讨论】: