在mysql中使用max和min查询'临时'

时间:2011-04-04 15:24:51

标签: mysql indexing temporary

我的查询存在一个大问题,我需要检索与每行相关的一些最大值和最小值。为简化起见,此查询正在连接到另一个表,但我只会显示最大和最小查询。

SELECT mv . * , mu . * 
FROM (

    SELECT Device_id, MAX( Last_time ) AS last_visit, 
                      MIN( Last_time ) AS first_visit
    FROM device_tracker
    GROUP BY Device_id
)mv
JOIN (
    SELECT Referral AS current_url, 
    Device_id, MAX( Last_time ) AS last_url_visit, MIN(Last_time ) AS first_url_visit
    FROM device_tracker GROUP BY Device_id, current_url) mu 
ON ( mv.Device_id = mu.Device_id )

如果我执行一个解释,它说这个'第一次加入'是使用临时和文件输出,这使得数据库在这一点上崩溃,使用几乎100%的CPU一段时间。

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY <derived2>  ALL NULL    NULL    NULL    NULL    7275     
1   PRIMARY <derived3>  ALL NULL    NULL    NULL    NULL    15137   Using where
3   DERIVED device_tracker  index   NULL    index_api   522 NULL    28392   Using index; Using temporary; Using filesort
2   DERIVED device_tracker  range   NULL    index_api   257 NULL    7099    Using index for group-by

问题:有没有办法强制此查询使用索引来避免临时和filesort?在此先感谢!!!

编辑:现在问题更加集中。如果我们只执行第二个子查询:

EXPLAIN SELECT Referral, Device_id, MAX( Last_time ), MIN( Last_time )
FROM device_tracker
GROUP BY Device_id, Referral

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  device_tracker  index   NULL    index_api   522 NULL    28412   Using index; Using temporary; Using filesort

我们设置了这些索引:

NAME:      TYPE:     ROWS:  FIELDS:
PRIMARY    PRIMARY   28413  id
index_api  INDEX     28413  Device_id, Last_Time, Referral

1 个答案:

答案 0 :(得分:0)

您是否在设备跟踪器上有(device_id,Last_time)索引?还有(Device_id,refferal,Last_time)。

索引和GROUP BY可能会遇到一些相当复杂的问题。