首页 > 解决方案 > MYSQL 查看查询性能问题

问题描述

我有 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 Query 2 比 SQL Query 1 快。但两者都存在性能问题。感谢对性能更好的查询的帮助。提前致谢。

标签: mysqlsqlperformancequery-optimizationmysql5

解决方案


为什么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)


推荐阅读