2011-04-04 138 views
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 
+0

你可以發佈你的表結構嗎?它可能有助於特別查看索引。 – Jaydee 2011-04-04 15:40:27

+0

@jaydee:我發佈了索引和一些新的信息。問題出在其中一個子查詢中。 – 2011-04-04 16:17:37

+0

是的,你似乎需要一個索引'Device_id,Referral'和一個'Device_id' – Timo 2011-04-04 17:36:01

回答

0

你對設備跟蹤器上(DEVICE_ID,時間:LAST_TIMEBREAK)的指數?還有(Device_id,refferal,Last_time)。

索引和GROUP BY可能有一些相當複雜的問題。

相關問題