【问题标题】:MySQL query with alias not using an index具有别名的 MySQL 查询不使用索引
【发布时间】:2015-01-10 02:32:56
【问题描述】:

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

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

序数,仪式日期都有一个索引。由于 yr 别名,它们没有被使用吗?有没有办法在 YEAR(ceremonydate) 上创建索引,而不仅仅是在仪式日期上创建索引?或者有没有办法索引别名?

【问题讨论】:

    标签: mysql database indexing


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-10
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多