2010-12-23 111 views
1

我在slowquerys日誌中發現了這個查詢。slowquery有什麼不對?

SELECT GREATEST(IFNULL(`twk-status`.`status`,0) , `groups`.`status`) 
FROM `groups` 
LEFT JOIN `twk-status` ON 
    (`twk-status`.`groupID` = `groups`.`ID` 
    AND `twk-status`.`startdate` <= FROM_UNIXTIME(1317204000) 
    AND `twk-status`.`enddate` >= FROM_UNIXTIME(1317204000) 
    AND ISNULL(`twk-status`.`deleted`) 
    AND `twk-status`.`groupID` = 11) 
WHERE `groups`.`ID` = 11; 

我跑使用EXPLAIN產生以下報告的查詢:

id table  possible_keys     key 
1 twk-status groupID,groupID_2,enddate  NULL 
1 groups  PRIMARY      PRIMARY 

這意味着MySQL並沒有使用任何的TWK狀態表中的三個可能的密鑰。正確?

下面是從TWK狀態

groupID (groupID) 
groupID_2 (groupID, startdate, enddate, deleted) 
enddate (enddate, createdate, deleted) 

鍵查詢使用組ID,開始日期,結束日期,刪除我想groupID_2對子級是關鍵。

或者這是查詢問題而不是索引問題?

謝謝先進。

+0

這個`EXPLAIN`很奇怪。您能否發佈表格的定義和** EXPLAIN`的精確**輸出? – Quassnoi 2010-12-23 15:40:44

+0

您正在使用哪個版本的MySQL? – Quassnoi 2010-12-23 16:13:27

回答

1

從你的解釋我可以判斷,訂單或表被交換。

對於來自twk-status每個記錄從groups相應的記錄被搜查,因爲你有一個PRIMARY KEY加入他人(twk-status.groupID = groups.ID

不過,我幾乎可以肯定,有什麼不對的EXPLAIN中條件,因爲MySQL無法交換LEFT JOIN的訂單。

請您發佈EXPLAIN的確切輸出?

更新:

在構建計劃,MySQL檢查存在於索引字段搜索常數值。

其中一些檢查失敗。不可能分辨出究竟是哪一個,但是您可能沒有groupID = 11twk-statusenddate >= FROM_UNIXTIME(1317204000)

MySQL剛剛用twk-status的空行值替換了整個連接,並將其與groupID = 11的組數據一起返回。