【问题标题】:Avoid creating temporary table when both group by and order by are used in query查询中同时使用 group by 和 order by 时避免创建临时表
【发布时间】:2011-05-27 02:06:39
【问题描述】:

有什么方法可以避免在这样的查询中创建临时表?

SELECT item_id FROM titem
GROUP BY item_id
ORDER BY item_created;

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

【问题讨论】:

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


    【解决方案1】:

    您的查询有问题。当执行分组依据时,为每个组选择了哪个 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 可以设置为模仿这种行为。

    【讨论】:

    • item_created - 是一个非规范化字段(来自表项),因此对于一个 uniq_id,item_created 将是相同的。我非规范化它的原因是使用索引进行排序。它运行良好,直到我需要使用 group-by。
    • 您可能会觉得这篇文章很有趣。 dev.mysql.com/tech-resources/articles/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多