簡體   English   中英

MYSQL 查看查詢性能問題

[英]MYSQL View Query Performance Issue

我有 5 張 SQL 表

  • 店鋪
  • 職員
  • 部門
  • 已售商品
  • 員工評級

我創建了一個將這四個表連接在一起的視圖。 最后一張表(staff_rating),我想在接近視圖行的商品售出時間(sold_items.date)的時間獲取評級列。 我嘗試了以下 SQL 查詢,這些查詢有效但存在性能問題。

SQL 查詢 1

SELECT s.name,
       s.country,
       d.name,
       si.item, 
       si.date, 
       (SELECT rating 
        FROM staff_ratings 
        WHERE staff_id = s.id 
        ORDER BY DATEDIFF(date, si.date) LIMIT 1) AS rating, 
       st.name, 
       st.owner
   FROM store st
   LEFT OUTER JOIN staff s ON s.store_id = st.id
   LFET JOIN departments d ON d.store_id = st.id
   LEFT JOIN sold_items si ON si.store_id = st.id

SQL 查詢 2

SELECT s.name,
       s.country,
       d.name,
       si.item, 
       si.date, 
       si.rating , 
       st.name, 
       st.owner
FROM store st
LEFT OUTER JOIN staff s ON s.store_id = st.id
LFET JOIN departments d ON d.store_id = st.id
LEFT JOIN (SELECT *,
                  (SELECT rating 
                   FROM staff_ratings 
                   WHERE staff_id = si.staff_id 
                   ORDER BY DATEDIFF(date, si.date) LIMIT 1) AS rating 
           FROM sold_items) si ON si.store_id = st.id

SQL 查詢 2 比 SQL 查詢 1 快。但兩者仍然存在性能問題。 感謝對性能更好的查詢的幫助。 提前致謝。

您的查詢對我來說看起來不正確(如對原始帖子的評論中所述;在銷售的聯接中缺少 staff_id 等)

忽略這一點,你最大的表現之一可能是這個......

ORDER BY DATEDIFF(date, si.date) LIMIT 1

該訂單只能通過將該員工的每條記錄與當前銷售記錄進行比較來回答。

理想情況下,您希望能夠從索引中找到適當的員工評級,而不必運行涉及評級表和銷售表中日期的計算。

例如,如果您想要“銷售前的最新評級”,則可以大大改進查詢......

SELECT
   s.name,
   s.country,
   d.name,
   si.item, 
   si.date, 
   (
     SELECT sr.rating 
       FROM staff_ratings sr
      WHERE sr.staff_id = s.id
        AND sr.date <= si.date
   ORDER BY sr.date DESC
      LIMIT 1
   )
    AS rating, 
   st.name, 
   st.owner
FROM store st
LEFT JOIN staff s ON s.store_id = st.id
LFET JOIN departments d ON d.store_id = st.id
LEFT JOIN sold_items si ON si.store_id = st.id

然后,使用staff_ratings(staff_id, date, rating)的索引,優化器可以非常快速地查找要使用的評級,而無需掃描該員工的每個單一評級。

為什么是DATEDIFF 像這樣的東西會更好嗎? 如果是這樣,給定的索引將使其工作得更快。

WHERE staff_id = s.id
  AND s.date >= s1.date
ORDER BY s.date
LIMIT 1

INDEX(staff_id, date)

你需要LEFT JOIN嗎? 也許是普通JOIN

d可能受益於INDEX(store_id, name)

暫無
暫無

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

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