zoukankan      html  css  js  c++  java
  • 查询优化--ORDER BY查询优化

    Mysql 系列文章主页 

    ===============

    ORDER BY 子句,尽量使用 Index 查询,避免使用 FileSort 排序

    尽可能在索引列上完成排序操作,遵照索引的最佳左前缀原则

    1 准备数据

    1.1 建表

    DROP TABLE IF EXISTS employee;
    CREATE TABLE IF NOT EXISTS employee (
        id INT PRIMARY KEY auto_increment,
        age INT,
        birth TIMESTAMP
    );

    1.2 插入数据

    INSERT INTO employee(age, birth) VALUES(22, NOW());
    INSERT INTO employee(age, birth) VALUES(23, NOW());
    INSERT INTO employee(age, birth) VALUES(24, NOW());

    2 测试&Explain分析

    2.1 创建索引

    CREATE INDEX idx_AgeBirth on employee(age, birth);

    2.2 测试

    Case#1:

    EXPLAIN SELECT * FROM employee WHERE age > 20 ORDER BY age;

    Case#2:

    EXPLAIN SELECT * FROM employee WHERE age > 20 ORDER BY age, birth;

    Case#3:

    EXPLAIN SELECT * FROM employee WHERE age > 20 ORDER BY birth;

    结果:出现了 Using Filesort

    Case#4:

    EXPLAIN SELECT * FROM employee WHERE age > 20 ORDER BY birth, age;

    结果:出现了 Using Filesort

    Case#5:

    EXPLAIN SELECT * FROM employee ORDER BY birth;

    结果:出现了 Using Filesort

    Case#6:

    EXPLAIN SELECT * FROM employee WHERE birth > '2018-01-01 00:00:00' ORDER BY birth;

    结果:出现了 Using Filesort

    Case#7:

    EXPLAIN SELECT * FROM employee WHERE birth > '2018-01-01 00:00:00' ORDER BY age;

    Case#8:

    EXPLAIN SELECT * FROM employee ORDER BY age ASC, birth DESC;

    结果:出现了 Using Filesort

    2.3 示例性总结

    Mysql支持两种方式的排序,Index和Filesort,Index效率高。它指Mysql扫描索引本身完成排序。Filesort效率较低。

    Order By 满足两情况,会使用Index方式排序:

    • Order By 语句使用索引最左前列
    • 使用 Where 子句与 Order By 子句条件列组合满足索引最左前列

    2.4 Filesort的两种排序算法

    2.4.1 双路排序

    Mysql 4.1 之前使用的,两次扫描磁盘

    2.4.2 单路排序

    是对双路排序的改进算法。

    从磁盘读取查询需要的所有列,按照 Order By 列在 Buffer 中对它们进行排序,然后扫描排序后的列表进行输出,它的效率更高一些,避免了两次读取数据。并且把随机IO变成了顺序IO,但是,它会使用更多的空间,因为它把每一行都保存在内存中了。

    但有可能出现“偷鸡不成蚀把米”的问题(类似于 Concurrent Mode Failure),这与 Sort Buffer 有很大关系(两个参数:sort_buffer_size & max_length_for_sort_data)

    2.5 Group By

    Group By 实质是先排序后进行分组,遵照索引的最佳左前缀原则

    3 总结

    Order By 要尽量使用 Index 排序,避免 Filesort 排序

  • 相关阅读:
    win8/10 bcdboot引导修复命令的原理和使用方法
    DD命令做备份和恢复
    基于DevExpress实现对PDF、Word、Excel文档的预览及操作处理
    工资计算方式
    什么样的辞职理由能让面试官满意
    使用sql删除数据库中的重复数据,只保留分组后的第一条数据
    mysql实现row_number()和row_number() over(partition by)
    c# dev Gridcontrol绑定多层list
    窗体高度获取,随机调整窗体展示的位置
    consul下载地址
  • 原文地址:https://www.cnblogs.com/cyhbyw/p/8853523.html
Copyright © 2011-2022 走看看