2012-11-26 18 views
3

如果沒有索引運行EXPLAIN時,如果key的字段值不爲空但Extra爲空,那麼是否使用了密鑰?

EXPLAIN SELECT exec_date, 
    100 * SUM(CASE WHEN cached = 'no' THEN 1 ELSE 0 END)/SUM(1) cached_no, 
    100 * SUM(CASE WHEN cached != 'no' THEN 1 ELSE 0 END)/SUM(1) cached_yes 
FROM requests 
GROUP BY exec_date 

此運行此EXPLAIN查詢輸出

id select_type table  type possible_keys key  key_len ref  rows Extra 
1 SIMPLE  requests ALL  NULL   NULL NULL NULL 478619 Using temporary; Using filesort 

如果我創建一個索引

ALTER TABLE requests ADD INDEX exec_date(exec_date); 

輸出是

id select_type table  type possible_keys key   key_len ref  rows Extra 
1 SIMPLE  requests index NULL   exec_date 4  NULL 497847 

由於Extra的值爲空,是否表示關鍵字exec_date未被使用?

在測試服務器上,有和沒有索引的實際(不是EXPLAIN語句)查詢的執行時間是相同的。

+0

是你的問題,爲什麼它不說'使用索引;'? –

+0

@Asad我的問題是,如果'key'下的值是'exec_date',但是'Extra'下面沒有說'使用索引',這是否意味着密鑰不會被使用? – user784637

回答

4

Using index並不意味着你的想法。如果它存在於Extra列中,則表示優化器實際上並未讀取整行,它正在使用索引(專門)來查找列信息。

的關鍵仍然是在使用其他的事情,比如進行查找,如果你有一個WHERE條款等。在特定情況下,例如,Using temporary;的消失實際上是否意味着正在使用索引,因爲MySQL不再需要將表格的內容重新排列成一個新的臨時表來執行GROUP BY

相關問題