0
是否有任何方法可以避免在此类查询中创建临时表?避免在查询中使用group by和order by时创建临时表
SELECT item_id FROM titem
GROUP BY item_id
ORDER BY item_created;
我试图创建索引(item_id, item_created)
和(item_created, item_id)
,但这并没有帮助。
是否有任何方法可以避免在此类查询中创建临时表?避免在查询中使用group by和order by时创建临时表
SELECT item_id FROM titem
GROUP BY item_id
ORDER BY item_created;
我试图创建索引(item_id, item_created)
和(item_created, item_id)
,但这并没有帮助。
您的查询存在问题。何时为每个组选择了哪个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既不是在聚合函数所选择的领域也不是该组中的条款。 MySQL可以被设置为模仿这种行为。
item_created - 是一个非规格化字段(来自表项),因此对于一个uniq_id,item_created将是相同的。我将它非规范化的原因是使用索引进行排序。它完美的工作,直到我需要使用group-by。 – 2010-12-20 07:58:57
您可能会觉得这篇文章很有趣。 http://dev.mysql.com/tech-resources/articles/debunking-group-by-myths.html – Jaydee 2010-12-20 09:30:47