Mysql 有没有一种方法可以比这个更快地创建SQL查询?

Mysql 有没有一种方法可以比这个更快地创建SQL查询?,mysql,sql,performance,Mysql,Sql,Performance,我有一个MySQL表,用于存储酒店预订的数据。 我需要一个查询,查看每个日期入住酒店的客人数量 我能够使用子查询创建一个查询,但它的执行速度非常慢。是否有更好的方法获取请求的数据?例如,将表连接到它本身,或者其他什么 我的问题是: SELECT CheckOutDate AS Date, (SELECT SUM(NrOfGuests) FROM tblGuests tG WHERE tG.CheckInDate <= tblGuests.CheckOutDate

我有一个MySQL表,用于存储酒店预订的数据。 我需要一个查询,查看每个日期入住酒店的客人数量

我能够使用子查询创建一个查询,但它的执行速度非常慢。是否有更好的方法获取请求的数据?例如,将表连接到它本身,或者其他什么

我的问题是:

SELECT CheckOutDate AS Date, 
    (SELECT SUM(NrOfGuests) FROM tblGuests tG 
    WHERE tG.CheckInDate <= tblGuests.CheckOutDate 
    AND tG.CheckOutDate > tblGuests.CheckOutDate 
    AND tG.IsCancelled = False AND tG.NoShow = False) 
AS NrOfGestsStaying 
FROM tblGuests 
GROUP BY CheckOutDate

使其执行更快的最佳方法是什么?

在原始查询中,SELECT使用子查询返回表中每一行的总和。之后,将使用“按签出日期分组”删除重复项。因此,换句话说,这是不同签出日期的用户总数

通过子查询不同的签出日期,可以提前删除重复的签出日期。因此,在接收查询中,对不同的签出日期只应用一次总和:


你应该检查执行计划。这里没有足够的信息来正确地建议性能您可以进行解释选择。。。然后发布结果?我会尝试连接而不是相关子查询。创建关系列索引解释结果:id选择类型表类型可能的键键键长度参考行额外1个主tblGuests范围NULL CheckOutDate 4 NULL 1552使用group by 2依赖子查询tG ref CheckInDate、CheckOutDate的索引,NoShow NoShow 2 const 13186使用where对不起,我不知道如何将其粘贴得更好。FALSE与0相同。”False'是一个5个字符的字符串。还添加INDEXNoShow、IsCancelled、CheckOutDate以帮助内部查询;添加INDEXCheckOutDate以帮助导出表。
SELECT dT.CheckOutDate
      ,(SELECT SUM(NrOfGuests) 
          FROM tblGuests tG 
         WHERE tG.CheckInDate <= dT.CheckOutDate 
           AND tG.CheckOutDate >= dT.CheckOutDate
           AND tG.IsCancelled = 0 
           AND tG.NoShow = 0
       ) AS NrOfGuests
  FROM ( 
         SELECT DISTINCT CheckOutDate
           FROM tblGuests
       ) AS dT
  ORDER BY dT.CheckOutDate