1
我在查询中需要检索与每一行相关的一些最大值和最小值的问题。为了简化,这个查询被加入到另一个表中,但我只会显示最大和最小查询。'在mysql中使用最大和最小查询'使用临时'
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
你可以发布你的表结构吗?它可能有助于特别查看索引。 – Jaydee 2011-04-04 15:40:27
@jaydee:我发布了索引和一些新的信息。问题出在其中一个子查询中。 – 2011-04-04 16:17:37
是的,你似乎需要一个索引'Device_id,Referral'和一个'Device_id' – Timo 2011-04-04 17:36:01