子查询与加入和哪里 - 哪一个更快?

时间:2017-07-14 18:54:48

标签: mysql performance query-performance

我有两个sql,它给了我相同的结果:

查询1:

SELECT
u.*, COUNT(po.order_id) products_count
FROM (SELECT * FROM orders o WHERE o.date >= (CURRENT_DATE() - INTERVAL 1 MONTH)) o
LEFT JOIN products_orders po ON po.order_id=o.id
JOIN users u ON u.id=o.user_id
GROUP BY po.order_id

和查询2:

SELECT
u.*, o.id order_id, COUNT(po.order_id) products_count
FROM users u
JOIN orders o ON o.user_id=u.id
LEFT JOIN products_orders po ON po.order_id=o.id
WHERE o.date >= (CURRENT_DATE() - INTERVAL 1 MONTH)
GROUP BY po.order_id

我想知道......哪一个应该更快? 查询说明显示它们是等于......你觉得伙计们怎么样? Query 1 Query 2

2 个答案:

答案 0 :(得分:0)

查询与您选择不同的列不完全相同 你可以直接在on子句中添加where条件,避免在哪里 使用subselect进行查询应该更快..因为不需要临时表来存储子查询的结果

{{1}}

检查避免在哪里使用

答案 1 :(得分:0)

通常,JOIN比子查询更有效,并反映在public class Test { public static void main(String[] args) { Object a = null; System.out.println(getThing(a)); } private static boolean getThing(Object o) { return o == null ? null : Boolean.TRUE; } } 输出中。这是因为使用子查询需要动态创建虚拟表,然后使用该表进行查询。在现有表上使用JOIN会跳过此步骤,并允许优化器以索引或缓存数据的形式利用此表的知识。

这里EXPLAINs相等的可能原因是你的子查询有多简单。由于您只是使用where条件执行select all,优化器通常可以注意到这一点并解析子查询和表上的JOIN并稍后应用WHERE。因此,优化器在执行之前有效地将子查询版本重写为JOIN版本。