MySQL 不使用索引的别名查询

MySQL query with alias not using an index

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

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

ordinal、cerededate 都有索引。由于 yr 别名,它们没有被使用吗?有没有办法在 YEAR(ceremonydate) 上创建索引而不仅仅是 ceremonydate?或者有没有办法索引别名?

是因为别名。 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

您可以通过 运行 一个简单的 select 查询并使用别名来测试它: SELECT ordinal, ceremonydate as yr FROM ... 并开始增加查询的复杂性,以查看停止使用索引的位置。最有可能的是,因为您是根据 YEAR(ceremonydate) mysql 进行排序,所以正在创建一个临时 table。您最好的选择是在您的代码中处理仪式日期。 MySQL 像 YEAR() 这样的内联处理和计算失去了很多效率,因为它必须创建那些临时的 tables。