首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用索引的别名MySQL查询

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

Stack Overflow用户
提问于 2015-01-10 02:32:56
回答 2查看 996关注 0票数 1

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

代码语言:javascript
复制
SELECT ordinal,YEAR(ceremonydate) as yr 
FROM awardinfo 
ORDER BY YEAR(ceremonydate) DESC LIMIT 1;

解释显示它没有使用索引:

代码语言:javascript
复制
id: 1
select_type:    SIMPLE
table: awardinfo
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 72
Extra: Using filesort

序号,礼仪都有一个索引。它们不是因为yr别名而被使用吗?是否有一种方法来建立一个指数的一年(仪式日期)而不是仅仅的仪式日期?或者有一种方法来索引别名?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-10 02:53:53

是因为化名。如果ORDER BY按索引的内容排序,则可以使用索引。虽然可以对ceremonyDate日期进行索引,但YEAR(ceremoneyDate)会将ceremonyDate的值更改为完全不同的值,因此YEAR(ceremoneyDate)不会被索引。

由于不能索引别名,这意味着为了让ORDER BY使用索引,它必须是一个简单的列名或列名列表。

您应该能够这样做并使用索引:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-01-10 02:57:08

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27872277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档