提问者:小点点

MySQL>SELECT COUNT(*)vs SHOW TABLE STATUS for row


我们的数据库中有一个表,它有几百万个条目(10.1.21-mariadb;InnoDB表引擎;Windows OS)。 我们可以使用命令show table STATUS LIKE'my_table_name'立即获得表中的行数。 但是,从my_table_name中选择COUNT(*)需要几分钟才能完成。

Q)为什么显示表状态像'my_table_name',比从my_table_name中选择计数(*)快得多?


共1个答案

匿名用户

因为一个是对所有行进行计数的查询,另一个是检索DB引擎维护的关于表的统计信息的命令。 没有任何坚定的保证表统计信息是最新的,因此获得精确计数的唯一方法是对行进行计数,但您可能不需要它始终都是非常精确的。 因此,您可以选择任何一种,取决于您对准确性和速度等的渴望。

请参阅https://pingcap.com/docs/stable/sql-statements/sql-statement-show-table-status/的屏幕截图

您可以看到该示例插入了5行,但表统计已经过期,并且表仍然报告0行。 运行ANALYZE TABLE将(可能)花费比计数行更长的时间,但是之后统计数据将是最新的(至少在一段时间内)。