在查询中使用group by和order by时,避免创建临时表

时间:2010-12-17 11:43:55

标签: mysql group-by query-optimization sql-order-by temp-tables

有没有办法避免在这样的查询中创建临时表?

SELECT item_id FROM titem
GROUP BY item_id
ORDER BY item_created;

我尝试创建索引(item_id, item_created)(item_created, item_id),但这没有帮助。

1 个答案:

答案 0 :(得分:3)

您的查询存在问题。当执行group by时,为每个组选择了item_created?默认情况下,MySQL会或多或少地随机选择一个组(来自组内)。由于每个组只使用一个item_created,因此需要临时表对其进行排序。

我建议你使用其中一个聚合函数(如min()或max())来获取一个更好的定义的item_created进行排序。这仍然无法修复临时表问题,item_id上的索引是您可以做的最好的。

SELECT item_id, max(item_created) as ic FROM titem
GROUP BY item_id
ORDER BY ic;

值得注意的是,一些数据库,例如Oracle(我被告知)会在原始查询中抛出错误,因为item_created既不在聚合函数的选定字段中,也不在group by子句中。 MySQL可以设置为模仿这种行为。