[英]'using temporary' with max and min queries in mysql
我的查询有一个大问题,我需要检索与每一行相关的一些最大和最小值。 为简化起见,此查询将联接到另一个表,但是我仅显示max和min查询。
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
您在设备跟踪器上的(device_id,Last_time)上有索引吗? 还有(Device_id,refferal,Last_time)。
索引和GROUP BY可能会有一些相当复杂的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.