MySQL information_schema.TABLE_ROWS与COUNT(*)结果不一致疑问
问题
我原本认为information_schema.partitions表中的TABLE_ROWS字段值应当与COUNT(*)查询结果完全一致,但在查询lootinfo分区表时发现二者数值存在差异,且两次查询执行间隔内未对表执行任何行插入、删除操作,想确认这种差异是否可能正常出现?
具体查询语句及返回结果如下:
mysql> select partition_name, partition_ordinal_position, table_rows from information_schema.partitions where table_name='lootinfo'; +----------------+----------------------------+------------+ | PARTITION_NAME | PARTITION_ORDINAL_POSITION | TABLE_ROWS | +----------------+----------------------------+------------+ | future | 3 | 0 | | p_202206 | 1 | 10676 | | p_202207 | 2 | 0 | +----------------+----------------------------+------------+ 3 rows in set (0.00 sec) mysql> select count(*) from lootinfo partition (p_202206); +----------+ | count(*) | +----------+ | 10360 | +----------+ 1 row in set (0.00 sec)
解答
这种差异是正常现象,不属于数据错误。
information_schema.partitions中的TABLE_ROWS是存储引擎维护的估算统计值,并非实时精确计数。以最常用的InnoDB引擎为例,该值通过采样数据页计算得出,本身就允许和实际行数存在偏差,偏差大小和采样率、数据页碎片化程度都有关系,和查询间隔内是否有增删操作无关。COUNT(*)执行时会实际扫描对应分区的存储数据,返回的是精确的真实行数,是统计行数的可靠依据。- 若需要让
TABLE_ROWS的估算值更贴近真实值,可以执行ANALYZE TABLE lootinfo;命令手动更新表统计信息,更新后估算偏差会缩小,但无法保证和COUNT(*)结果完全一致。
内容的提问来源于stack exchange,提问作者Ellisein
相关产品推荐
相关产品推荐

