2015-01-10 55 views
1

下面的查詢別名顯示在我的日誌不會使用索引:MySQL查詢與不使用索引

SELECT ordinal,YEAR(ceremonydate) as yr 
FROM awardinfo 
ORDER BY YEAR(ceremonydate) DESC LIMIT 1; 

解釋說明它不使用索引:

id: 1 
select_type: SIMPLE 
table: awardinfo 
type: ALL 
possible_keys: NULL 
key: NULL 
key_len: NULL 
ref: NULL 
rows: 72 
Extra: Using filesort 

序, ceremonydate都有一個指標。由於別名,他們沒有被使用嗎?有沒有一種方法可以在YEAR(ceremonydate)上創建索引,而不是僅僅使用ceremonydate?或者有沒有一種方法來索引別名?

回答

0

這是因爲別名。 ORDER BY可以使用索引,如果它是由索引的東西排序。雖然ceremonyDate日期可能會編入索引,但YEAR(ceremoneyDate)會將ceremonyDate的值更改爲完全不同的值,因此YEAR(ceremoneyDate)未編制索引。

而且由於您無法索引別名,這意味着要使ORDER BY使用索引,它必須是簡單的列名稱或列名稱列表。

你應該能夠做到這一點,使用索引:

SELECT ordinal,YEAR(ceremonydate) as yr 
FROM awardinfo 
ORDER BY ceremonydate DESC LIMIT 1; 

不知道你的數據是什麼樣子,這可能爲你工作,而不是。

更多信息:http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

0

您可以通過運行一個簡單的選擇查詢,並使用別名來測試這一點: SELECT ordinal, ceremonydate as yr FROM ...,並開始增加複雜查詢,看看停止使用索引的位置。最有可能的,因爲你正在訂購基於YEAR(ceremonydate) mysql正在創建一個臨時表。你最好的選擇是在代碼中處理ceremonydate。因爲它必須創建那些臨時表,所以MySQL在內聯處理和計算方面失去了很多效率,如YEAR()