在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
我知道我可以为代码计时,但我希望能够深入了解手头的问题 所有相关的索引都是自然而然的,因为没有索引进行优化是很愚蠢的。
答案 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
需要(field1
,mydate
)索引。
答案 2 :(得分:0)
慢下来
这里发生的是您要求MySQL根据(可能)非索引列mydate
对记录进行排序。
任何排序都需要时间,但与非索引列相比,索引列的排序速度非常快。
这是一些额外的阅读:http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/