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