当前位置: 首页 > 知识库问答 >
问题:

MYSQL视图查询性能问题

景修杰
2023-03-14

我有5个SQL表

  • 存储
  • 工作人员
  • 部门
  • SOLD_Items
  • staff_rating

我创建了一个视图,将这四个表连接在一起。最后一个表(staff_rating),我希望在接近项目被出售的时间(sold_items.date)获得视图行的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快。但这两种方法都存在性能问题。感谢对具有更好性能的查询的帮助。提前道谢。

共有1个答案

丁长卿
2023-03-14

您的查询在我看来不对(正如在原始帖子的评论中提到的;在销售的连接中缺少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)的索引,优化器可以非常快速地查找要使用的评级,而不必扫描该工作人员的每个评级。

 类似资料:
  • 问题内容: 我有一张约有100,000个用户的表。 第一种情况: 当我为上述查询做一个解释计划时,我得到的费用为5200 第二种情况: 当我对第二个查询做一个解释计划时,我得到的费用为100,000。 视图中的where子句如何工作?在视图检索所有行之后是否应用where子句?如何解决此问题? 问题答案: 这是关于已使用的视图算法的。 该 合并 算法行之有效最表的索引和诸如此类的东西-的 不是Te

  • 问题内容: 有人愿意帮助我吗?在具有10000行的MEMORY表上,以下查询大约需要18秒。如果我没有“ where”约束,则只需不到一分钟的时间。我已经打开查询缓存以及将其作为准备好的语句来尝试。有什么我可以做的吗?索引还是什么? 问题答案: 我认为这将为您提供所需的信息,而不管您关注的滚动日期范围…我已经通过创建带有两个标识列的自己的“发票”表进行了测试。使用@mySQL变量实际上非常简单,可

  • 视图查询可以实现不依赖数据库视图的多表查询,并不需要数据库支持视图,是JOIN方法的推荐替代方法,例如: Db::view('User', 'id,name') ->view('Profile', 'truename,phone,email', 'Profile.user_id=User.id') ->view('Score', 'score', 'Score.user_id=Pr

  • 问题内容: 我试图了解一个PHP-MySQL项目。该项目非常复杂,因此很难逐行对其进行探索。 我想做的是,比较一个MySQL数据库的实例。 说, 1)MySQL已启动并正在运行。这是数据库的第一个实例。2)用户从PHP前端登录,然后注销。3)这是数据库的第二个实例。 我需要以友好的方式查看实例一和实例二之间的变化。 关于开源工具或任何其他技术的任何建议? 问题答案: 您可以使用mysqldump拍

  • 我想创建一个名为的视图,该视图显示个人的所有信息,除了他们的客户ID之外,还列出每个人在他/她的帐户中有多少余额。 我的疑问是: 现在,这个查询将创建视图,但当我想通过以下命令查看该视图中的信息时: 它将返回一个错误: 如何走出这个误区?

  • 1)使用的第一个查询...大约用了23秒 目前我修改了查询..这需要大约9秒 我不确定要做的表演是什么?我希望这个查询是快速的..我尝试索引rid和id,但这仍然使查询变得更糟。 下面是表格的详细信息 mza_movie_upload MZA_Movie_Statics