[英]optimizing mysql subquery execution time
我有以下查詢:
select
qs.*
from
(
select
tsk.id,
tsk.request_id,
tsk.hash_id
from
user_tasks as usr
inner join unassigned_tasks as tsk on usr.task_id = tsk.id
where
usr.assigned_to = 53
AND tsk.product_id NOT IN (
SELECT
product_id
FROM
product_progresses
WHERE
request_id = tsk.request_id
)
ORDER BY
tsk.id
) as qs <-- this takes about 233ms.
WHERE
qs.id = ( <-- should this subquery execute for every row from outer result-set row?
SELECT
min(qt.id)
FROM
(
select
tsk.id,
tsk.request_id,
tsk.hash_id
from
user_tasks as usr
inner join unassigned_tasks as tsk on usr.task_id = tsk.id
where
usr.assigned_to = 53
AND tsk.product_id NOT IN (
SELECT
product_id
FROM
product_progresses
WHERE
request_id = tsk.request_id
)
ORDER BY
tsk.id
) as qt <-- this takes about 233ms.
WHERE
qt.id > 83934
)
qs
和qt
需要大約相同的時間來執行,即大約233ms
。
此外,執行整個查詢需要大約相同的時間。
我有一個概念, where qs.id = (...)
對從qs
生成的結果集中的每一行執行一次內部查詢。
在當前情況下, qs
輸出10
行。
所以我決定測試子查詢是否對每一行執行 10 次。
這是我放在子查詢中的內容:
WHERE qs.id = (
SELECT
SLEEP(1)
)
而不是where qs.id = ( select min(qt.id) ... )
。
這大約需要10.246
秒,這證明正在為每一行運行內部查詢。
所以有了這個,初始查詢不應該花費大約(qt time) 233 * 10 (rows from qs)
= 2330
毫秒?
是因為select min()..
只計算一次嗎?
在 MySQL 中, FROM
子句中的子查詢在WHERE
子句中的子查詢之前進行評估。
有用的文章: https : //www.eversql.com/sql-order-of-operations-sql-query-order-of-execution/
在你的情況,這是造成qs
被之前充分評估WHERE
子句中的因素。如果你想要的。 qs
受限制qt
,你應該能夠通過unnesting實現這一qs
或移動qt
里面qs
。
但在實踐中,與其對WHERE
子句使用子查詢,不如使用連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.