簡體   English   中英

MySQL多子查詢與整個查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM