簡體   English   中英

有沒有辦法優化這個查詢

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

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