[英]'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.