MySQL查询速度较慢-在组级别上连续日期的差异

MySQL查询速度较慢-在组级别上连续日期的差异,mysql,Mysql,下面是我的MySQL查询,查找每个帐户的连续日期之间的差异,然后使用结果准备一个频率计数表。这个查询当然很慢,但在此之前我做的是正确的吗?如果可以的话,请帮忙。还嵌入了一个小数据样本。 谢谢你的时间。 奥祖哈 很可能,内联视图的具体化占用了大部分时间。确保有适当的索引可用于提高联接操作的性能;tbl_name(id,date)上的覆盖索引可能最适合此查询 如果有合适的索引可用(如上所述),则可以通过以下查询获得更好的性能: SELECT d.month_diff , COUNT(*)

下面是我的MySQL查询,查找每个帐户的连续日期之间的差异,然后使用结果准备一个频率计数表。这个查询当然很慢,但在此之前我做的是正确的吗?如果可以的话,请帮忙。还嵌入了一个小数据样本。 谢谢你的时间。 奥祖哈


很可能,内联视图的具体化占用了大部分时间。确保有适当的索引可用于提高联接操作的性能;tbl_name(id,date)上的覆盖索引
可能最适合此查询

如果有合适的索引可用(如上所述),则可以通过以下查询获得更好的性能:

SELECT d.month_diff
     , COUNT(*)
  FROM ( SELECT IF(@prev_id = t.id
                  , TIMESTAMPDIFF(MONTH, t.date, @prev_date )
                  , NULL
                ) AS month_diff
              , @prev_date := t.date
              , @prev_id   := t.id
           FROM tbl_name t
          CROSS
           JOIN (SELECT @prev_date := NULL, @prev_id := NULL) i
          GROUP BY t.id DESC, t.date DESC
       ) d
 WHERE d.month_diff IS NOT NULL
 GROUP BY d.month_diff
请注意,不能保证使用MySQL用户定义变量。但我们确实观察到以特定方式编写的查询的一致行为。(MySQL的未来版本可能会改变我们观察到的行为。)



编辑:我修改了上面的查询,将
订单替换为t.id,t.date
,将
分组替换为t.id,t.date
。。。从示例数据中不清楚
(id,date)
是否保证是唯一的。(如果我们有该保证,那么我们不需要GROUP BY,我们可以使用ORDER BY。否则,我们需要
GROUP BY
来获得原始查询返回的相同结果。)

为什么您费心将@初始化为null?您可以放弃该交叉联接。@Arth:因为否则我们无法保证在语句中第一次引用
@prev\u id
@prev\u date
时,它们将包含哪些值。是的,可以取消内联视图的交叉连接,并用单独的
SET@prev_date=NULL
SET@prev_id=NULL
语句替换。(用户定义的变量会保留在会话中,当语句开始执行时,我们不知道这些变量中存储了什么值;如果这些变量没有初始化,我们可以演示得到“错误”的结果。(我的首选是在语句中包含UDV的初始化。)有道理,谢谢你。我没有在声明之外思考!哇,在不到3秒钟的时间里就完成了,原来的花了很长时间。我只需修改组的t.id以订购,因为(id,日期)保证是唯一的。向你致敬,先生。
SELECT d.month_diff
     , COUNT(*)
  FROM ( SELECT IF(@prev_id = t.id
                  , TIMESTAMPDIFF(MONTH, t.date, @prev_date )
                  , NULL
                ) AS month_diff
              , @prev_date := t.date
              , @prev_id   := t.id
           FROM tbl_name t
          CROSS
           JOIN (SELECT @prev_date := NULL, @prev_id := NULL) i
          GROUP BY t.id DESC, t.date DESC
       ) d
 WHERE d.month_diff IS NOT NULL
 GROUP BY d.month_diff