簡體   English   中英

Mysql left join with nested select 慢,如何優化

[英]Mysql left join with nested select slow, how to optimize

我有一個 LEFT JOIN mysql 查詢,執行起來非常慢,我正在尋找改進。 我有一個表“VM”列出了“VmId”(+ 一些其他數據)和另一個表“VM_Status”列出了 VM 的狀態(上/下),每一行都有一個“inputDate”。

表 VM 為 7.000 行,表 VM_Status 為 76.000 行

我需要 select 7.000 VM 的最新狀態

我的查詢如下,執行需要 25 秒:

SELECT 
VM.*,
`VM_Status`.`Status` AS `Status`
FROM VM
left join (
   select
       * 
   from
       `VM_Status` `s1`
   where
       (
           `s1`.`InputDate` = (
               select
                   max(`s2`.`InputDate`)
               from
                   `VM_Status` `s2`
               where
                   (`s1`.`VmId` = `s2`.`VmId`)
           )
       )

) `VM_Status` on(
   (
       `VM_Status`.`VmId` = `WORKLOAD`.`VmId`
   )
)

我怎樣才能更快地做到這一點?

您可以使用 window 函數。
Window MySQL 中的功能

MySQL 支持 window 函數,對於查詢中的每一行,使用與該行相關的行執行計算。

在您的情況下,您可以使用帶有 order by 子句的 RANK() 或 DENSE_RANK() 函數,並在 window 中獲取該 MAX (避免慢連接)。
請參閱: 排名

與此類似的東西:

select 
    *
from (
SELECT 
    VM.*,
    `VM_Status`.`Status` AS `Status`,
    RANK() OVER(PARTITION BY `VM_Status`.`VmId` ORDER BY `VM_Status`.`InputDate` DESC) rank
    FROM VM left join `VM_Status`
    ON `VM_Status`.`VmId` = `VM`.`VmId`
) `last_status`
WHERE 
    rank = 1

暫無
暫無

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

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