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 排序

查询优化--ORDER BY查询优化的更多相关文章

  1. mysql查询优化之三:查询优化器提示(hint)

    目录: <MySQL中的两种临时表>--强制使用临时表 SQL_BUFFER_RESULT <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示( ...

  2. 查询优化 | MySQL慢查询优化

    ​Explain查询:rows,定位性能瓶颈. 只需要一行数据时,使用LIMIT1. 在搜索字段上建立索引. 使用ENUM而非VARCHAR. 选择区分度高的列作为索引. 采用扩展索引,而不是新建索引 ...

  3. PostgreSQL查询优化之子查询优化

    子查询优化 上拉子连接 上拉子连接主要是把ANY和EXIST子句转换为半连接 void pull_up_sublinks(PlannerInfo *root) { Node *jtnode; //子连 ...

  4. Mysql--开篇&目录

    Mysql 现在是互联网公司中使用得非常广泛的数据库产品了,开源.免费.小巧.易用等诸多特性奠定了其夯实的基础.自己从事 JavaWeb 也有一段时间了,工作中也是用的 Mysql,也会涉及到分析.慢 ...

  5. 数据库查询优化器的艺术:原理解析与SQL性能优化

    数据库查询优化器的艺术 作者:李海翔 Oracle公司MySQL全球开发团队.资深专家 简单的浏览了一遍,由于以前没有接触过SQL优化这些知识,读起来还是非常吃力的,不过收获还是很大的. 作者通过对M ...

  6. MongoDB实战指南(二):索引与查询优化

    数据库保存记录的机制是建立在文件系统上的,索引也是以文件的形式存储在磁盘上,在数据库中用到最多的索引结构就是B树.尽管索引在数据库领域是不可缺少的,但是对一个表建立过多的索引会带来一些问题,索引的建立 ...

  7. PostgreSQL查询优化逻辑优化之其他

    上一节我们介绍了PostgreSQL的子查询优化,子查询优化把一部分可以优化的子查询上拉到主查询成为join. preprocess_expression 将表达式(目标列,where,join,ha ...

  8. MySQL查询优化器工作原理解析

    手册上查询优化器概述 查询优化器的任务是发现执行SQL查询的最佳方案.大多数查询优化器,包括MySQL的查询优化器,总或多或少地在所有可能的查询评估方案中搜索最佳方案.对于联接查询,MySQL优化器所 ...

  9. Mysql查询优化从入门到跑路(三)查询的基本操作

    查询的基本操作 1.选择操作 对应的是限制条件,操作对象是二维表的行.     优化方式:选择操作下推     目的:尽量减少连接操作前的元租数,使得中间临时关系尽量少(元祖数少,连接得到的元组数就少 ...

随机推荐

  1. WPF 自定义RadioButton样式

    一.RadioButton基本样式 RadioButton基本样式包含两种状态,这里也是使用两张图片来代替两种状态,当然你也可以通过IconFont或Path来替换这两种状态. 效果如下: 样式代码如 ...

  2. emqtt 试用(九)ssl认证 - 客户端 mqttfx 验证

    一.代码生成证书 1.安装openssl,配置path变量 安装文件:Win64OpenSSL-1_1_0f.exe 安装openssl:C:\OpenSSL-Win64 配置path变量:C:\Op ...

  3. elk调试环境

    http://10.110.22.30:9100/

  4. linux ubunt 安装软件的前期准备——更新源的更换

    如果是高手,请翻到页面最下方,更换更新源的总结,直接操作即可 可能会优点啰嗦,但是认真看,一定能解决问题~~希望对大家有帮助~ 最近在熟悉linux环境,自己安装了一个ubuntu虚拟机. 很多朋友问 ...

  5. tornado解决高并发的初步认识牵扯出的一些问题

    #!/bin/env python # -*- coding:utf-8 -*- import tornado.httpserver import tornado.ioloop import torn ...

  6. php实现记住密码自动登录的功能

    $username=trim($_POST['username']); $password=md5(trim($_POST['password'])); $ref_url=$_GET['req_url ...

  7. innerHTML与innerText的区别

    innerHTML获取元素的HTML内容,和设计元素的HTML内容(HTML标签会被解析)例如:ele.innerHTML="<strong>我会被解释加粗</strong ...

  8. CentOS在线安装Mysql5.7

    一.通过Yum命令安装 1.下载rpm安装源 官方地址:https://dev.mysql.com/downloads/repo/yum/ rpm文件地址:https://dev.mysql.com/ ...

  9. R语言-美国枪杀案分析

    案例:该数据集的是一个关于美国2017年犯罪的一个数据集,接下来我们对该数据集进行分析 字段: #### S# :数据编号 #### Location:案件发生城市,州 #### Date:时间 ## ...

  10. [LeetCode] Design Excel Sum Formula 设计Excel表格求和公式

    Your task is to design the basic function of Excel and implement the function of sum formula. Specif ...