1

MySQL 中“group by”语句的复杂性是什么?

我正在管理各种大表,我也想知道是否有任何方法可以计算查询将花费多少时间。

4

1 回答 1

0

这个问题不可能通过了解整个查询的样子来回答。有些分组可能非常昂贵,而另一些则非常便宜,这完全取决于数据库中的索引是如何设置的,您分组的值是否可以缓存等。

例如,这是一个非常便宜的组:

CREATE TABLE t (a INT, KEY(a));
SELECT * FROM WHERE 1 GROUP BY a;

因为 a 是一个索引。

但是对于这样的事情,它非常昂贵,因为它需要进行表扫描。

CREATE TABLE t (a INT);
SELECT * FROM WHERE 1 GROUP BY a;

一般如果某个key不可用,数据库会在内存中为group by子句创建一个临时表,遍历所有的值,将每个值插入到临时表中,并在结果集中对应行的索引,然后它会从临时表中选择,从每一列中选择第一行并将其作为结果发送回来。根据您是否使用每个 group by 子句的“额外”行(即使用 MAX()、GROUP_CONCAT() 或类似方法),它将需要再次获取所有行。

您可以使用 EXPLAIN 来确定 MySQL 将使用什么策略,如果可以使用索引,则使用“Extra”(按执行成本升序排列)“Using index”,如果需要从磁盘读取所有行,则使用“Using filesort” , 如果需要临时文件,则列将包含“使用临时文件”

于 2012-04-21T14:42:02.780 回答