簡體   English   中英

在MySQL中使用max和min查詢“使用臨時”

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM