子查询与加入和哪里 - 哪一个更快?
问题描述:
我有两个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
答
查询是不是你选择不同的列完全相同
你可以直接在条款上避免地方
应该更快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版本。
如果解释计划是相同的,那么表现应该是相同的。记住基于成本的优化器可以用你的SQL“小提琴”来获得最好的结果(至少它在正确性和性能方面认为是最好的) – xQbert
请不要交叉发帖:https:// dba .stackexchange.com/questions/179878/subquery-vs-join-and-where-which-one-is-faster –
已投票删除 – breq