簡體   English   中英

優化mysql子查詢執行時間

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

qsqt需要大約相同的時間來執行,即大約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子句使用子查詢,不如使用連接。

請參閱SQL 僅選擇列上具有最大值的行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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