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 ...
随机推荐
- json解析写入mysql
import json,requests,pymysql from pprint import pprint from datetime import datetime dt=datetime.now ...
- tf 版本更新 记录
tf 经常更新版本,网上教程又是各版本都有,且不标明版本,致使各种用法难以分清哪个新,哪个旧,这里做个记录,以前的博客我就不更新了,请大家见谅. tf.nn.rnn_cell 改为 tf.contri ...
- MVC4实现批量更新数据
Html: @using (Html.BeginForm("Edit", "Home")) { <div> <input type=" ...
- L251
Beer before wine, or wine before beer; whatever the order, you’ll feel queer. That, at least, is the ...
- TensorFlow函数:tf.truncated_normal
tf.truncated_normal函数 tf.truncated_normal( shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, ...
- 32位linux(ubuntu) exec: arm-none-linux-gnueabi-g++未找到;The tslib functionality test failed!
请先参考:http://blog.csdn.net/ankwyq/article/details/7768809 通过上面那篇文章,我确实把问题又推进了一步,接下来就是下面这个问题: exec: ar ...
- python flask大型项目目录
Hello World 作者背景 应用程序简介 要求 安装 Flask 在 Flask 中的 “Hello, World” 下一步? 模板 回顾 为什么我们需要模板 模板从天而降 模板中控制语句 模板 ...
- Pandas分组统计函数:groupby、pivot_table及crosstab
利用python的pandas库进行数据分组分析十分便捷,其中应用最多的方法包括:groupby.pivot_table及crosstab,以下分别进行介绍. 0.样例数据 df = DataFram ...
- Python 多个装饰器装饰同一个函数
def wrapper1(fn): def inner(*args, **kwargs): print("1111111") ret = fn(*args, **kwargs) p ...
- 微软Power BI 每月功能更新系列——7月Power BI 新功能学习
Power BI Desktop 7月产品功能摘要 7月是Power BI Desktop团队的重要发布!但由于官方延迟更新,我们的讲述也就更晚了一点,也许大家觉得没有必要了,都8月了,谁还看7月的? ...