我的查询存在一个大问题,我需要检索与每行相关的一些最大值和最小值。为简化起见,此查询正在连接到另一个表,但我只会显示最大和最小查询。
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
答案 0 :(得分:0)
您是否在设备跟踪器上有(device_id,Last_time)索引?还有(Device_id,refferal,Last_time)。
索引和GROUP BY可能会遇到一些相当复杂的问题。