我有這種形式的MySQL查詢:SELECT中的子查詢或JOIN中的子查詢?
SELECT
employee.name,
totalpayments.totalpaid
FROM
employee
JOIN (
SELECT
paychecks.employee_id,
SUM(paychecks.amount) totalpaid
FROM
paychecks
GROUP BY
paychecks.employee_id
) totalpayments on totalpayments.employee_id = employee.id
我最近發現,它返回快得多這種形式:
SELECT
employee.name,
(
SELECT
SUM(paychecks.amount)
FROM
paychecks
WHERE
paychecks.employee_id = employee.id
) totalpaid
FROM
employee
我很驚訝會有的速度差,並且較低的查詢會更快。我更喜歡開發的上層表單,因爲我可以獨立運行子查詢。
有沒有辦法獲得「兩全其美」:快速結果返回並能夠獨立運行子查詢?
非常感謝,spencer7593!我可以嘗試在派生表上強制索引嗎? (我不太熟悉索引或創建它們的語法。) – 2015-02-11 17:26:40
@YossiFendel:我不相信在派生表上創建索引有任何提示。這隻會在版本5.6和更高版本中發生。 EXPLAIN輸出應顯示正在使用哪種連接操作。通過完全避免子查詢可能獲得最佳性能。我在編輯答案時提供了一個示例。 – spencer7593 2015-02-11 17:31:42
@YossiFendel:另一個選項是創建一個臨時表(帶索引)作爲子查詢的結果,然後在第二個查詢中引用該臨時表。這很麻煩,但它可以提高性能,特別是當多個查詢中引用相同的內聯視圖時......因爲我們避免了多次實現它。 – spencer7593 2015-02-11 17:36:42