[英]MySQL Multiple Subqueries vs. whole queries
我想知道从MySQL数据库获取数据的哪种方式具有更好的性能特征。
在一个主查询中使用子查询:
SELECT
(SELECT SUM(`number`) FROM `table`) as `number_sum`,
(SELECT MAX(`number`) FROM `table`) as `number_max`,
(SELECT MIN(`number`) FROM `table`) as `number_min`
或者,3个不同的SELECT
语句检索相同的数据。
提前致谢!
由于这三个聚合来自具有相同WHERE
条件的同一个表,因此您不需要子选择。 所有三个聚合都在相同的行分组上运行(没有指定GROUP BY
,因此整个表都有一行),因此它们都可以直接存在于SELECT
列表中。
SELECT
SUM(number) AS number_sum,
MAX(number) AS number_max,
MIN(number) AS number_min
FROM `table`
如果任何聚合需要基于您在WHERE
子句中过滤的不同条件,那么您将需要对不同的条件使用子选择,或者进行笛卡尔连接。 对于仅返回一行的聚合,此子选择和以下LEFT JOIN
方法应该是等效的,性能方面:
SELECT
/* Unique filtering condition - must be done in a subselect */
(SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum,
MAX(number) AS number_max,
MIN(number) AS number_min
FROM `table`
或者等效于上面的查询,您可以对没有ON
子句的子查询LEFT JOIN
。 只有当您知道子查询只返回一行时才应该这样做。 否则,您将得到一个笛卡尔积 - 由连接的一侧返回的行数乘以另一侧返回的行数。
这是方便,如果你需要用一组返回几列WHERE
子句条件和几列一组不同的WHERE
条件,但是从每边只有一排的JOIN
。 在这种情况下, JOIN
应该比使用相同WHERE
子句执行两个子选择更快。
这应该更快......
SELECT
/* this one has two aggregates sharing a WHERE condition */
subq.number_sum_filtered,
subq.number_max_filtered,
/* ...and two aggregates on the main table with no WHERE clause filtering */
MAX(`table`.number) AS number_max,
MIN(`table`.number) AS number_min
FROM
`table`
LEFT JOIN (
SELECT
SUM(number) AS number_sum_filtered,
MAX(number) AS number_max_filtered
FROM `table`
WHERE `somecolumn = `somevalue`
) subq /* No ON clause here since there's no common column to join on... */
比这个...
SELECT
/* Two different subselects each over the same filtered set */
(SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum_filtered,
(SELECT MAX(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_max_filtered,
MAX(`table`.number) AS number_max,
MIN(`table`.number) AS number_min
FROM
`table`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.