Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL视图查询性能问题_Mysql_Sql_Performance_Query Optimization_Mysql5 - Fatal编程技术网

MYSQL视图查询性能问题

MYSQL视图查询性能问题,mysql,sql,performance,query-optimization,mysql5,Mysql,Sql,Performance,Query Optimization,Mysql5,我有5个SQL表 百货商店 工作人员 部门 已售出的商品 员工评级 我创建了一个视图,将这四个表连接在一起。最后一个表staff_rating,我想在接近商品售出时获取查看行的rating列。 我尝试了以下SQL查询,这些查询有效,但存在性能问题 SQL查询1 SELECT s.name, s.country, d.name, si.item, si.date, (SELECT rating FROM s

我有5个SQL表

百货商店 工作人员 部门 已售出的商品 员工评级 我创建了一个视图,将这四个表连接在一起。最后一个表staff_rating,我想在接近商品售出时获取查看行的rating列。 我尝试了以下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快。但两者都存在性能问题。感谢对性能更好的查询的帮助。提前谢谢。

我觉得你的问题与我在原帖评论中提到的不一样;参与销售等活动时缺少员工身份证

忽略这一点,您最大的性能影响之一可能是

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 id、date、rating的索引,优化者可以非常快速地查找要使用的评级,而无需扫描该员工的每个评级。

为什么日期不同?有什么东西比这更好吗?如果是这样,给定的索引将使其工作得更快

WHERE staff_id = s.id
  AND s.date >= s1.date
ORDER BY s.date
LIMIT 1
和INDEXstaff_id,日期

你需要左键连接吗?也许是简单的加入


d可能受益于INDEXstore_id,name

第二个查询似乎是综合错误的。它必须生成未知列错误。MySQL 5.x或MySQL 8+?另外,您的表上存在哪些索引等?如果您想让我们了解您现有查询的行为,那么对您的查询运行EXPLAIN也是值得的。最后,如前所述,您的查询在语法上不正确;请确保您包含使用的准确的工作查询-要求我们尝试通过您的打字错误来解释只会使一切变得不必要的困难。然后请回答您的问题。我们需要更多的信息来帮助您。@MatBailie,MYSQL 5.xIt看起来很“奇怪”,您加入一个商店对它的工作人员来说,然后当您加入销售的物品时,您不包括工作人员id,因此如果一个商店销售了100件物品,有8名工作人员,那么您最终会得到800个组合,每个组合都会查找工作人员的评分。。。这是真的吗?请编辑您的问题以包含完整的表定义,以便我们可以看到实际存在哪些外键。