MySQL Execution Plan--数据排序操作
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--数据排序操作的更多相关文章
- MySQL Execution Plan--文件排序(file sort)
在MySQL处理ORDER BY语句时,如果查询无法利用索引的有序性,则需要额外操作对数据进行排序.在MySQL中有三种排序算法: 1.快速排序(Quick Sort),对冒泡排序的一种改进,基本思想 ...
- Mysql对表中 数据 的操作 DML
上一知识点回顾: mysql的备份: 直接使用navicat进行备份 转储SQL文件:有结构和数据/ 仅结构 两种 需要还原时 单击 数据库名字 运行SQL文件 创建表ctreate 修改表alt ...
- Mysql 指定字段数据排序 以及django的实现
业务场景: mysql 查询 select * from dormitory_applysettleorder order by FIELD(status,40) desc django 实现: or ...
- Mysql笔记4数据表操作1
1查看表的结构 (1)show create table +数据库名称 (2)desc+数据库名称 2修改表 (1)表中添加列 alter table 数据库名称 add column addr va ...
- C API向MySQL插入批量数据的快速方法——关于mysql_autocommit
MySQL默认的数据提交操作模式是自动提交模式(autocommit).这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行.我们可以通过设置autocommit的值改变是否是自 ...
- MongoDB(课时15 数据排序)
3.4.2.10 数据排序 在MongoDB里数据排序操作使用“sort()”函数,在进行排序的时候可以有两个顺序:升序(1),降序(-1). 范例:排序 db.students.find().sor ...
- MySQL的数据库,数据表,数据的操作
数据库简介 概念 什么是数据库?简单来说,数据库就是存储数据的"仓库", 但是,光有数据还不行,还要管理数据的工具,我们称之为数据库管理系统! 数据库系统 = 数据库管理系统 + ...
- MySQL 服务器变量 数据操作DML-视图
原文:MySQL 服务器变量 数据操作DML-视图 SQL语言的组成部分 常见分类: DDL:数据定义语言 DCL:数据控制语言,如授权 DML:数据操作语言 其它分类: 完整性定义语言: DDL的一 ...
- MySQL 数据表操作
MySQL 数据表操作 创建MySQL数据表需要以下信息: -表名: -表字段名: -定义每个表字段: 一.创建数据表 1)mysql> create table table_name (c ...
随机推荐
- MyBatis逆向工程:根据table生成Model、Mapper、Mapper.xml
逆向工程工具 下载地址:https://download.csdn.net/download/zhutouaizhuwxd/10779140 1.工程导入Eclipse 2.运行MainUI.jav ...
- CentOS7安装配置Bacula yum方法
参考: https://www.baidu.com/link?url=o2QIy2YZWjsJPAFJuYFhrH3nPvtyRkSe-o5Q_FqFZ5E1EMOsIOmGeKm0HAonwHOw8 ...
- Docker(2):快速入门及常用命令
什么是Docker? Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行和管理 ...
- 3.Python爬虫入门三之Urllib和Urllib2库的基本使用
1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...
- Alpha冲刺1
前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/9948330.html 作业博客:https://edu.cnblogs.com/campus/ ...
- synchronized(五)
package com.bjsxt.base.sync005;/** * synchronized的重入 * @author alienware * */public class SyncDubbo2 ...
- golang---map类型
map 类似其它语言中的哈希表或字典,以key-value形式存储数据 key必须是支持==或!=比较运算的类型,不可以是函数.map或slice Map查找比线性搜索快很多,但比使用索引访问数据的类 ...
- C#窗体布局技巧
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- python第一天 计算机基础
计算机硬件组成 控制器: 运算器 存储器I/O设备 与运行程序有关的三大核心硬件 cpu,内存,硬盘 运行软件时,硬件的运作流程 1.软件最先存放于硬盘当中,软件的代码运行时会由硬盘读入内存 2.cp ...
- foreman ubuntu16快速安装
Quickstart Guide The Foreman installer is a collection of Puppet modules that installs everything re ...