使用不使用索引的别名的MySQL查询

时间:2015-01-10 02:32:56

标签: mysql database indexing

以下查询在我的日志中显示为未使用索引:

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?或者有没有办法索引别名?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以通过运行简单的选择查询并使用别名来测试: SELECT ordinal, ceremonydate as yr FROM ...并开始为查询添加复杂性,以查看索引停止使用的位置。最有可能的是,因为您正在基于YEAR(ceremonydate)进行订购,所以mysql正在创建一个临时表。您最好的选择是在代码中处理ceremonydate。 MySQL使用内联处理和计算(例如YEAR())会失去很多效率,因为它必须创建这些临时表。