2015-01-10 54 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()