• 7.2.12. MySQL如何优化ORDER BY



    在某些情况中,MySQL可以使用一个索引来满足ORDER BY子句,而不需要额外的排序。

    即使ORDER BY不确切匹配索引,只要WHERE子句中的所有未使用的索引部分和所有额外的ORDER BY 列为常数,就可以使用索引。

    下面的查询使用索引来解决ORDER BY部分:

    SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;

    SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2;

    SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;

     SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;

    在某些情况下,MySQL不能使用索引来解决ORDER BY,尽管它仍然使用索引来找到匹配WHERE子句的行。这些情况包括:

    · 对不同的关键字使用ORDER BY:

    ·                SELECT * FROM t1 ORDER BY key1, key2;

    · 对关键字的非连续元素使用ORDER BY:

    ·                SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2

    · 混合ASC和DESC:

    ·                SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

    · 用于查询行的关键字与ORDER BY中所使用的不相同:

    ·                SELECT * FROM t1 WHERE key2=constant ORDER BY key1

    · 你正联接许多表,并且ORDER BY中的列并不是全部来自第1个用于搜索行的非常量表。(这是EXPLAIN输出中的没有const联接类型的第1个表)。

    · 有不同的ORDER BY和GROUP BY表达式。

    · 使用的表索引的类型不能按顺序保存行。例如,对于HEAP表的HASH索引情况即如此。

    通过EXPLAIN 可以检查MySQL是否可以使用索引来解决查询。如果Extra列内有Using filesort,则不能解决查询。

     

    https://dev.mysql.com/doc/refman/5.6/en/order-by-optimization.html

  • 相关阅读:
    【mac】homebrew国内源安装加速
    【Mac】快速删除指定文件夹下的.DS_Store文件
    【mac】Mac微信小助手安装和卸载
    如何高效的开展app的性能测试
    什么是C#?什么是DOTNET?
    Xamarin Android使用自签名证书
    产品经理的私房菜
    java并发编程2-Synchronized关键字底层实现原理详解
    VS Code 1.60 发布!竟然可以自动检测编程语言了!
    为什么'x1B'.length===1?x与u知识延伸
  • 原文地址:https://www.cnblogs.com/yuyutianxia/p/5943071.html
Copyright © 2020-2023  润新知