慢得到与每行参数相关的最大值和最小值

问题描述:

我需要获取特定的跟踪数据,包括几个最大和最小值。我已经有一个可怕的方法来做到这一点,但正如你知道这是非常慢,因为我使用子查询和表中有成千上万的行。具体而言,我需要获取每行不同的MAX值,具体取决于当前行的type_dev。有24000条记录会变得不可用,而当我尝试使用MAX子句时,我认为它更慢。慢得到与每行参数相关的最大值和最小值

SELECT dt.some_data, dt.date_visit, dt.url, 
     (SELECT date_visit FROM device_tracker 
     WHERE type_dev = dt.type_dev ORDER BY date_visit DESC LIMIT 1) last_visit, 
     (SELECT date_visit FROM device_tracker 
     WHERE type_dev = dt.type_dev and url = dt.url ORDER BY date_visit DESC LIMIT 1) last_visit_to_this_url 
    FROM device_tracker dt WHERE some_where_clauses; 

请注意,我不需要全局最大值(也可能是很容易的),但例如,在这种情况下,我得到的每一个type_dev的最大日(每行可以是不同的输入或不输入)以及关于每一行的特定网址的最大日期。

我需要与minimun日期相同。

确实有很多更好的方法来做到这一点。任何人都可以点亮它吗?

SELECT * 
FROM (
     SELECT type_dev, MAX(date_visit) AS maxt, MIN(date_visit) AS mint 
     FROM device_tracker 
     GROUP BY 
       type_dev 
     ) t 
JOIN (
     SELECT type_dev, url, MAX(date_visit) AS maxtu, MIN(date_visit) AS mintu 
     FROM device_tracker 
     GROUP BY 
       type_dev, url 
     ) tu 
ON  tu.type_dev = t.type_dev 
JOIN device_tracker dt 
ON  dt.type_dev = tu.type_dev 
     AND dt.url = tu.url 

(type_dev, url, date_visit)上创建一个复合索引,以便快速工作。

+0

这太神奇了。像魅力一样工作。即使没有综合指数,速度也要快得多。谢谢! – 2011-03-22 16:16:22

+0

@Javier:尝试添加复合索引,查看差异。 – Quassnoi 2011-03-22 16:16:56

+0

我已经做到了,我的意思是说在设置索引之前,我看到了巨大的差异。设置后它甚至更好一点。谢谢! – 2011-03-23 10:58:48