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

问题描述:

我有两个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

+0

如果解释计划是相同的,那么表现应该是相同的。记住基于成本的优化器可以用你的SQL“小提琴”来获得最好的结果(至少它在正确性和性能方面认为是最好的) – xQbert

+0

请不要交叉发帖:https:// dba .stackexchange.com/questions/179878/subquery-vs-join-and-where-which-one-is-faster –

+0

已投票删除 – breq

查询是不是你选择不同的列完全相同
你可以直接在条款上避免地方
应该更快withou子选择查询添加WHERE条件..因为不需要用于存储临时表子查询

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

检查避免其中使用上

通常j中的结果OIN比子查询更有效率,并反映在EXPLAIN输出内。这是因为使用子查询需要虚拟表格,然后使用该表格进行查询。在现有表上使用JOIN将跳过此步骤,并允许优化器利用索引或缓存数据的形式了解此表。

您的EXPLAIN在这里相同的可能原因是因为您的子查询有多简单。由于您只是使用where条件进行全选,优化程序通常会注意到这一点,并解析表中的子查询和JOIN,并在稍后应用WHERE。因此,优化器在执行之前会有效地将您的子查询版本重写为JOIN版本。