繁体   English   中英

为什么从table_name中选择count(*)是如此之慢?

[英]Why select count(*) from table_name is so slow?

mysql> select count(*)
    -> from ip_address_varchar20;
+----------+
| count(*) |
+----------+
|  2764687 |
+----------+
1 row in set (1 min 28.80 sec)

我认为应该有一个字段来存储任何表的大小,但我发现count(*)是如此之慢。

为什么DBMS不优化这个? 或者我对此做了一些不好的练习?

来自: https//wiki.postgresql.org/wiki/Why_PostgreSQL_Instead_of_MySQL : _Comparing_Reliability_and_Speed_in_2007

已知PostgreSQL执行速度慢的一个操作是在表中执行完整的行计数,通常使用此SQL:

SELECT COUNT(*)FROM table

这很慢的原因与PostgreSQL中的MVCC实现有关。 多个事务可以看到数据的不同状态的事实意味着“COUNT(*)”在整个表中汇总数据没有直接的方法; 在某种意义上,PostgreSQL必须遍历所有行。 这通常会导致顺序扫描读取有关表中每一行的信息。

Postgres的上述解释也适用于MySQL的InnoDB。 由于InnoDB使用MVCC。

有一些方法可以使用InnoDB进行快速计数。 例如,您可以使用估计,或者您可以使用触发器来维护表的行数。

有些数据库会在外部存储表的大小。 但是,大多数数据库直接或通过索引读取所有数据,以满足COUNT()查询。

这可确保准确计算行数。 它还考虑了事务语义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM