1

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

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

问题:有没有办法强制这个查询使用索引来避免临时和文件排序?提前致谢!!!

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

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
4

1 回答 1

0

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

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

于 2011-04-04T15:45:20.523 回答