0

任何人都可以向我解释哪个查询性能更高,幕后的区别是什么?

SELECT PRODUCT.id, SUM(PRODUCTION.quantity)
FROM PRODUCT 
LEFT JOIN PRODUCTION ON PRODUCT.id = PRODUCTION.product_id
GROUP BY PRODUCT.id

相对

SELECT 
    PRODUCT.id, 
    (SELECT SUM(quantity) 
     FROM PRODUCTION 
     WHERE PRODUCTION.product_id = PRODUCT.id)
FROM PRODUCT

这两个查询产生相同的结果。

4

2 回答 2

1

两个查询都不相同。在第一个查询中,您使用的是 LEFT OUTER JOIN,但在子查询中,您使用的是内部连接 ​​product_id。

现在在性能方面,与子查询相比,这将为您提供良好的性能

SELECT PRODUCT.id, SUM(PRODUCTION.quantity)
FROM PRODUCT LEFT JOIN PRODUCTION ON PRODUCT.id = PRODUCTION.product_id
GROUP BY PRODUCT.id
于 2020-07-15T10:10:58.000 回答
0

使用正确的索引,子查询可能会比LEFT JOIN版本更好。

原因很简单:它避免了对整个表的聚合,MySQL 通常通过对数据进行排序来实现聚合(一个昂贵的操作)。也就是说,当聚合键是主键时,一些数据库(但我不认为 MySQL 是其中之一)有特殊的优化。

您希望在表上的索引是production(product_id, quantity).

但是,与任何性能问题一样,您应该在数据和系统上尝试这两个版本。

于 2020-07-15T11:02:49.820 回答