强制`group by`对DESC进行排序会加快代码速度,还是降低代码速度?

时间:2011-08-30 17:08:49

标签: mysql group-by query-optimization

在MySQL中group by执行隐式order by ASC 如果您想添加ORDER BY ASC,这很好,因为结果已经订购。

但是如果你想要ORDER BY .. DESC MySQL必须完全相反地对结果集进行排序。

这个技巧会加速选择,减慢速度,或者什么都不做

SELECT field1, field2 FROM atable 
GROUP BY -mydate   -- group by trick to force a `group by ... desc`
ORDER BY mydate DESC

我知道我可以为代码计时,但我希望能够深入了解手头的问题 所有相关的索引都是自然而然的,因为没有索引进行优化是很愚蠢的。

3 个答案:

答案 0 :(得分:2)

在我的测试中,添加任何类型的修改器以按-分组以更改排序顺序会减慢速度。

但是您可以指定:

SELECT id, name, sum(amount) FROM customers GROUP BY id DESC

MySQL将很乐意按DESC顺序排序结果,而无需额外的order by子句。这不会导致添加-的额外运行时间。

答案 1 :(得分:1)

我认为你错了:GROUP BY没有对数据进行排序。这是默认的MySQL行为,因为MySQL添加了与您设置的ORDER BY相同的GROUP BY,正如您在第一句中提到的那样。

因此,如果您使用ORDER BY NULL禁用排序,则根本没有排序。 GROUP BY只会在可能的情况下使用索引将行组合在一起。因此,“技巧”是错误的,因为你将删除在mydate上使用索引的能力。只要索引对它有好处,GROUP BY就会很好。

所以:

SELECT field1, field2 FROM atable 
GROUP BY mydate
ORDER BY NULL
如果你有(mydate)和

的索引,那么

应该非常快

SELECT field1, field2 FROM atable 
GROUP BY mydate
ORDER BY mydate DESC

应该一样快(取决于表结构,MyISAM以相反的顺序稍慢)。

如果您有WHERE子句,请检查您是否在索引中添加了列,例如:

SELECT field1, field2 FROM atable 
WHERE fied1 = 5
GROUP BY mydate
ORDER BY mydate DESC

需要(field1mydate)索引。

答案 2 :(得分:0)

慢下来

这里发生的是您要求MySQL根据(可能)非索引列mydate对记录进行排序。

任何排序都需要时间,但与非索引列相比,索引列的排序速度非常快。

这是一些额外的阅读:http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/