[英]Is there a way to optimize this query
我已經寫了一個查詢,但它需要很多時間。 我想知道是否有任何解決方案可以優化它而無需在 MYSQL 中創建臨時表。 有沒有辦法優化子查詢部分,因為 AccessLog2019 很大,所以它需要永遠)
這是我的查詢
SELECT distinct l.ListingID,l.City,l.ListingStatus,l.Price,l.Bedrooms,l.FullBathrooms, gc.Latitude,gc.Longitude , count(distinct s.AccessLogID) AS access_count, s.LBID , lb.CurrentListingID
from lockbox.Listings l
JOIN lockbox.GeoCoordinates gc ON l.ListingID = gc.ID
LEFT JOIN lockbox.LockBox lb ON l.ListingID = lb.CurrentListingID
LEFT JOIN
(SELECT * FROM lockbox.AccessLog2019 ac where ac.AccessType not in('1DayCodeGen','BluCodeGen','SmartMACGen') AND DATEDIFF(NOW(), ac.UTCAccessedDT ) < 1 ) s
ON lb.LBID = s.LBID
WHERE l.AssocID = 'AS00000000CC' AND (gc.Confidence <> '5 - Unmatchable' OR gc.Confidence IS NULL OR gc.Confidence = ' ')
group BY l.ListingID
謝謝
如果您可以通過 避免外部group by
,那將是一個巨大的勝利。 我在想:
SELECT l.ListingID, l.City, l.ListingStatus, l.Price, l.Bedrooms, l.FullBathrooms,
gc.Latitude, gc.Longitude,
(select count(*)
from lockbox.LockBox lb join
lockbox.AccessLog2019 ac
on lb.LBID = ac.LBID
where l.ListingID = lb.CurrentListingID and
ac.AccessType not in ('1DayCodeGen', 'BluCodeGen', 'SmartMACGen') and
DATEDIFF(NOW(), ac.UTCAccessedDT) < 1
) as cnt
from lockbox.Listings l JOIN
lockbox.GeoCoordinates gc
ON l.ListingID = gc.ID
WHERE l.AssocID = 'AS00000000CC' AND
(gc.Confidence <> '5 - Unmatchable' OR
gc.Confidence IS NULL OR
gc.Confidence = ' '
)
注意:這不會選擇s.LBID
或lb.CurrentListingID
因為這些在您的查詢中沒有意義。 如果我理解正確,這些在不同的行上可能有不同的值。
您可以嘗試將子查詢拆分為 JOIN 子句。
它可能會提示優化器它可以首先使用 LBID 字段,然后稍后測試 AccessType(以防優化器在您進行子選擇時沒有弄清楚)。
SELECT distinct l.ListingID,l.City,l.ListingStatus,l.Price,l.Bedrooms,l.FullBathrooms, gc.Latitude,gc.Longitude , count(distinct s.AccessLogID) AS access_count, s.LBID , lb.CurrentListingID
from lockbox.Listings l
JOIN lockbox.GeoCoordinates gc ON l.ListingID = gc.ID
LEFT JOIN lockbox.LockBox lb ON l.ListingID = lb.CurrentListingID
LEFT JOIN AccessLog2019 s
ON lb.LBID = s.LBID
AND s.AccessType not in('1DayCodeGen','BluCodeGen','SmartMACGen')
AND DATEDIFF(NOW(), s.UTCAccessedDT ) < 1
WHERE l.AssocID = 'AS00000000CC' AND (gc.Confidence <> '5 - Unmatchable' OR gc.Confidence IS NULL OR gc.Confidence = ' ')
group BY l.ListingID
請注意,這是 JOIN 子句中的條件給出與使用 WHERE 子句不同的行為的情況之一。 如果您只有lb.LBID = s.LBID
,然后有我在外部查詢的WHERE
中寫的條件,結果會有所不同。 他們將排除匹配lb.LBID = s.LBID
的記錄。 但在JOIN
子句中,它是外連接條件的一部分。
SELECT *
--> 只選擇需要的列。SELECT DISTINCT ... GROUP BY
-- 做一個或另一個,而不是兩個。INDEX(AssocID, ListingID)
( INDEX(AssocID, ListingID)
順序)DATEDIFF(NOW(), ac.UTCAccessedDT ) < 1
--> ac.UTCAccessedDT > NOW() - INTERVAL 1 DAY
(或任何您的意圖。然后添加INDEX(UTCAccessedDT)
OR
難以優化; 考慮清理數據,以便Confidence
沒有 3 個表示同一事物的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.