MySQL查询很慢 - 在组级别的连续日期中存在差异

时间:2014-09-25 19:11:56

标签: mysql

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

     ID    DATE
    403    2008-06-01
    403    2012-06-01
    403    2011-06-01
    403    2010-06-01
    403    2009-06-01
  15028    2011-07-01
  15028    2010-07-01
  15028    2009-07-01
  15028    2008-07-01

SELECT 
    month_diff, 
    count(*) 
FROM
(SELECT t1.id, 
        t1.date, 
        MIN(t2.date) AS lag_date, 
        TIMESTAMPDIFF(MONTH, t1.date, MIN(t2.date)) AS month_diff
FROM    tbl_name T1
        INNER JOIN tbl_name T2
            ON  t1.id = t2.id
            AND t2.date > t1.date
GROUP BY t1.id, t1.date
ORDER BY t1.id, t1.date
)
GROUP BY month_diff
ORDER BY month_diff

1 个答案:

答案 0 :(得分:1)

可能,实现内联视图大部分时间都是如此。确保您有合适的索引可用于提高连接操作的性能;覆盖索引ON 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的未来版本可能会改变我们观察到的行为。)


编辑:我修改了上面的查询,将ORDER BY t.id, t.date替换为GROUP BY t.id, t.date ...从示例数据中不清楚(id,date)是否可以保证是独特。 (如果我们确实有这种保证,那么我们不需要GROUP BY,我们可以使用ORDER BY。否则,我们需要GROUP BY来获得原始查询返回的相同结果。)< / p>