MySQL数据排序

MySQL中对数据进行排序有三种方式:
1、常规排序(双路排序)
2、优化排序(单路排序)
3、优先队列排序

优先队列排序使用堆排序算法,利用堆数据结构在所有数据中取出前N条记录。

常规排序和优化排序

常规排序(双路排序):
先对排序列+行指针(RowID或主键)进行排序,再根据行指针取出整行数据。
优点:需要排序的"数据"较小,单个soft buffer中能存放更多记录,排序速度更快
缺点:按照行指针取整行数据时,会产生大量随机IO,影响服务器IO性能

优化排序(单路排序):
先按照行指针取出整行数据,再对数据按照排序列进行排序。
优点:先按照行指针取数时,能顺序读取,减少随机IO操作
缺点:单个soft buffer只能存放更少记录,如果使用

当排序元组小于max_length_for_sort_data时,MySQL才会考虑使用优化排序(单路排序)。
有优化常规排序(双路排序)中随机IO问题,MySQL先将行指针(RowID或主键)进行缓冲排序,合并随机IO为顺序IO,该缓冲大小由参数read_rnd_buffer_size控制。

常规排序和优化排序使用快速排序算法和归并排序算法,先将数据拆分放入sort buffer(该Buffer的大小由参数sort_buffer_size控制)中进行快速排序后存入临时文件,再将多个排序后的临时文件使用归并排序算法进行合并得到最终结果。

PS: 在SHOW PROCESSLIST中出现filesort指数据在内存中排序,并不一定会使用临时文件。

优先队列排序
在MySQL 5.6版本中对LIMIT M,N语句进行优化,由于该语句不需要对所有数据进行排序,仅需要计算出前M+N个值,因此采用堆排序来优化。
对于升序操作,可以采用大顶堆方式计算,对于降序操作,可以采用小顶堆方式计算。

MySQL三种排序算法:

快速排序(Quick Sort)是对冒泡排序的一种改进,基本思想是选取一个记录作为枢轴,经过一趟排序,将整段序列分为两个部分,其中一部分的值都小于枢轴,另一部分都大于枢轴。然后继续对这两部分继续进行排序,从而使整个序列达到有序。

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

堆排序是利用堆的数据结构实现的排序算法,通过调整二叉树上父节点和左右子节点的位置,最终得到一个有序序列

参考链接:

https://www.cnblogs.com/chengxiao/p/6194356.html
https://www.cnblogs.com/chengxiao/p/6129630.html
https://blog.csdn.net/san_er/article/details/46006199

MySQL Execution Plan--数据排序操作的更多相关文章

  1. MySQL Execution Plan--文件排序(file sort)

    在MySQL处理ORDER BY语句时,如果查询无法利用索引的有序性,则需要额外操作对数据进行排序.在MySQL中有三种排序算法: 1.快速排序(Quick Sort),对冒泡排序的一种改进,基本思想 ...

  2. Mysql对表中 数据 的操作 DML

    上一知识点回顾: mysql的备份: 直接使用navicat进行备份 转储SQL文件:有结构和数据/ 仅结构 两种 需要还原时 单击 数据库名字  运行SQL文件  创建表ctreate 修改表alt ...

  3. Mysql 指定字段数据排序 以及django的实现

    业务场景: mysql 查询 select * from dormitory_applysettleorder order by FIELD(status,40) desc django 实现: or ...

  4. Mysql笔记4数据表操作1

    1查看表的结构 (1)show create table +数据库名称 (2)desc+数据库名称 2修改表 (1)表中添加列 alter table 数据库名称 add column addr va ...

  5. C API向MySQL插入批量数据的快速方法——关于mysql_autocommit

    MySQL默认的数据提交操作模式是自动提交模式(autocommit).这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行.我们可以通过设置autocommit的值改变是否是自 ...

  6. MongoDB(课时15 数据排序)

    3.4.2.10 数据排序 在MongoDB里数据排序操作使用“sort()”函数,在进行排序的时候可以有两个顺序:升序(1),降序(-1). 范例:排序 db.students.find().sor ...

  7. MySQL的数据库,数据表,数据的操作

    数据库简介 概念 什么是数据库?简单来说,数据库就是存储数据的"仓库", 但是,光有数据还不行,还要管理数据的工具,我们称之为数据库管理系统! 数据库系统 = 数据库管理系统 + ...

  8. MySQL 服务器变量 数据操作DML-视图

    原文:MySQL 服务器变量 数据操作DML-视图 SQL语言的组成部分 常见分类: DDL:数据定义语言 DCL:数据控制语言,如授权 DML:数据操作语言 其它分类: 完整性定义语言: DDL的一 ...

  9. MySQL 数据表操作

    MySQL 数据表操作 创建MySQL数据表需要以下信息: -表名: -表字段名: -定义每个表字段: 一.创建数据表 1)mysql> create  table  table_name (c ...

随机推荐

  1. opencv测试代码

    摄像头摄影 #include <iostream>#include <opencv2/opencv.hpp>using namespace cv;using namespace ...

  2. EF-关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析

    前有ADO.NET,后有ORM模式的EntityFramework.这两种技术都实现了对数据库的访问操作.如果要说哪种技术好,就看项目架构的大小,使用者的熟练程度等等,毕竟萝卜白菜,各有所爱. 今天要 ...

  3. C/C++知识补充 (1)

    ● C++的圆括号运算符() 下列关于圆括号运算符的功能说法不正确的是(C) . A. 可用于强制类型转换 B 可用于类型构造 C 可用于类型声明 D 可用于函数调用 对大部分可重载的运算符来说,它既 ...

  4. Android : 修改内核源码 and 编译、打包成新的boot.img

    一.Android内核源码的下载: 1.Google GIT地址: $ git clone https://android.googlesource.com/kernel/common.git $ g ...

  5. ui-router ng-router

    开发中常用ui-router来设置路由: ui-router使用很简单,延续了之前ngRoute的特点. 1.首先得注入ui.router模块. 接下来就是简单的配置 2.$stateProvider ...

  6. centos7安装配置zabbix4.0

    zabbix01    198.8.8.211    zabbix-server4.0 zabbix02    198.8.8.212    zabbix-agent4.0 一:zabbix服务端环境 ...

  7. 一、TCP扫描技术

    一.TCP扫描技术 常用的端口扫描技术有很多种,如 TCP connect() 扫描 .TCP SYN 扫描.TCP FIN 扫描 等,网络上也有很多文章专门介绍,比如 :http://www.ant ...

  8. angular2.0 官网架构文档

    Angular 是一个用 HTML 和 JavaScript 或者一个可以编译成 JavaScript 的语言(例如 Dart 或者 TypeScript ),来构建客户端应用的框架. 该框架包括一系 ...

  9. Oracle备份

    今天被吊,特来学习备份. https://blog.csdn.net/zhaiqi618/article/details/5616215 https://www.cnblogs.com/yingpp/ ...

  10. Getting started with 3G | ip.access nano3G+OpenBSC+Osmocom-bb Part 1

    English Version could be find at Osmocom.org https://osmocom.org/projects/cellular-infrastructure/wi ...