4

我有一个message_message包含 3000000 条记录的表。

当我进行计数(*)查询时,它非常慢......:

mysql> select count(*) from message_message;

+----------+

| 计数(*) |

+----------+

| 2819416 |

+----------+

一组 1 行(2 分 35.35 秒)

解释一下:mysql> explain select count(*) from message_message;

| 编号 | 选择类型| 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 |额外 |

| 1 | 简单 | message_message | 索引 | 空 | 初级 | 4 | 空 | 2939870 | 使用索引 |

一组中的 1 行(0.02 秒)

发生什么事?

4

2 回答 2

5

看看InnoDB 中的这篇文章,您需要进行全表扫描,在 MyISAM 中,它是一个索引读取。

如果你使用一个where子句,尽管它改变了执行模式以使用索引,所以通常 InnoDB 在完全不受限制的计数上会比 MyISAM 慢,因为性能在受限计数上匹配。

于 2012-07-16T13:49:55.287 回答
0

如果要统计记录数,最好查询整个表,使用结果集的num_rows属性。Count(...)通常在您想要进行聚合查询时使用(与 结合使用GROUP BY)。

于 2012-07-16T13:51:56.997 回答