order by 排序原理及性能优化

6 篇文章 0 订阅
订阅专栏

前言

排序是我们在写项目中经常用的sql语句的关键字。 往往order by 用不好的话也会对sql性能有一定的影响。我们现在就来介绍一下他的执行过程,并介绍一下优化。

正言

首先我们来举个例子,假设你要查询城市是”杭州“的所有人的名字,并且按照姓名排序返回前1000个人的姓名、年龄。
表定义:
在这里插入图片描述
这时,你的sql语句可以这么写:
在这里插入图片描述
这个语句看上去逻辑很清晰,我们还是需要看看他的sql执行过程。

执行过程一:全字段索引

我们需要在city上添加一个索引。 我们在执行explain命令来看看这个语句的执行情况。
在这里插入图片描述
Extra这个字段中的”Using filesort“ 表示的就是需要排序,MySql会给每个线程分配分配一块内存用于排序,称为sort_buffer。

下面是图示:

在这里插入图片描述

从图中可以看到,满足city=‘杭州’条件的行,是从ID_X到ID_(X+N)的这些记录。
通常情况下,这个语句执行流程如下所示:

  1. 初始化sort_buffer, 确定放入name、city、age这三个字段;
  2. 从索引city找到第一个满足city=“杭州” 条件的主键id,也就是图中的ID_X;
  3. 到主建id索引取出整行,取name、city、age 三个 字段的值,存入sort_buffer中;
  4. 从索引city取下一个记录的主键id ;
  5. 重复步骤3、4直到city的值不满足查询条件为止,对应的主键id也就是图中的ID_Y;
  6. 对sort_buffer 中的数据按照字段name做快译排序;
  7. 按照排序结果取前1000行返回给客户端;

我们暂且把这个排序过程,称为全字段排序,执行流程的示意图
在这里插入图片描述

图中“按name排序 ”这个动作,可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和参数 sort_buffer_size;

routId 排序

在上面这个算法过程里面,只对原表的数据读了一遍,剩下的操作都是在sort_buffer和临时文件中执行的。但这个算法有一个问题,如果查询返回的数据字段多,那么内存中放的数据就要分成多个临时文件,排序的性能就会很差。

修改参数 max_length_for_sort_data,是MySql中专门控制用于排序的行数据的长度的一个参数,它的意思是,如果单行的长度超过这个值 ,MySQL就认为单行太大,要换一个算法。
在这里插入图片描述
city,name,age这三个字段的定义总长度是36,我把max_length_for_sort_data设置为16,那么放入sort_buffer的字段只有要排序的列(即 name 字段 是order by 后面的关键字)和主键id。
但这时,排序的结果就因为少了city和age字段的值 ,不能直接返回了,整个执行的流程就变成 如下所示的样子:

  1. 初始化sort_buffer,确定放入两个字段,即name和id;
  2. 从索引city找到第一个满足city='上海’条件的主键,也就是图中的ID_X;
  3. 到主键id索引取出整行,取name、id这两个字段,存入sort_buffer中;
  4. 从索引city取下一个记录的主键id;
  5. 重复3、4步骤,直到找到不city!=‘上海’;
  6. 对sort_buffer中的数据按照name进行排序;
  7. 遍历排序结果,取前1000行,并按照id的值回到原表中的city、name和age三个字段返回给客户端。
    在这里插入图片描述

对排序进行优化

alter table t add index_city(city,name);

这样数据的索引就有按照name进行排序。 这样整个排序过程就变成了下面这样。

  1. 从索引(city,name)找到第一个满足city="杭州"条件的主键id;
  2. 到主键id索引取出整行,取name、city、age三个字段的值,作为结果集的一部分直接返回。
  3. 从当前索引取出一个索引值,id.
  4. 重复2、3步。
    在这里插入图片描述

在使用explain 来分析这个sql
在这里插入图片描述
可以看到extra字段中没有Using filesort了,也就是不需要排序了。
由于覆盖索引的原则,我们可以在进行优化。

alter table t add index_city(city,name,age);

在使用explain 对sql进行分析
在这里插入图片描述
发现使用Using index,表示的就是使用了覆盖索引,性能上会快很多。

总结

创建索引在添加和修改数据的时候是会对性能有损耗的, 在优化的时候要考虑使用的场景。

文中的内容借鉴了,极客时间中的Mysql的内容。

猿来衣舍

这是博主开的淘宝小店,主要经营舒适保暖的服饰,有袜子、主题卫衣、保暖衣。欢迎大家选购。

我们也在着手开发脚手架,到时候会做为商店福利的赠送给老用户

猿来衣舍
猿来衣舍
猿来衣舍
猿来衣舍

打开淘宝搜索 “猿来衣舍”这四个字就可以搜到小店,希望大家多多支持。

一个人能够走多远,关键在于与谁同行,我用跨越山海的一路相伴,希望得到您用金钱的称赞。

MySQL order by性能优化方法实例
01-19
前言 工作过程中,各种业务需求在访问数据库的时候要求有order by排序。有时候不必要的或者不合理的排序操作很可能导致数据库系统崩溃。如何处理好order by排序呢?本文从原理以及优化层面介绍 order by 。 一 MySQLorder by的原理   1 利用索引的有序性获取有序数据   当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,且索引访问方式为 rang,ref 或者 index 的时候,MySQL 可以利用索引顺序而直接取得已经排好序的数据。这种方式的 order BY 基本上可以说是最优的排序方式了,因为
若sql语句中order by指定了多个字段,则怎么排序
最新发布
蓝易云
04-18 159
当我们在ORDER BY子句中指定多个字段时,SQL会按照指定的字段顺序进行排序。举例来说,假设我们有一个员工表(Employees),包含员工姓名(Name)、部门编号(DepartmentID)和入职日期(HireDate)等多列。在SQL中,NULL值在排序时被视为最低的值,即如果是升序排序,NULL值会排在最前面。另外,在处理文本字段时也需要注意字符集和字符顺序的问题。需要注意一点是,在ORDER BY子句中可以为每一项指定不同方向的排序:ASC表示升序、DESC表示降序,默认为ASC。
MySQL Order By实现原理分析和Filesort优化
weixin_30788239的博客
12-29 1881
MySQL中的ORDER BY有两种排序实现方式: 1、利用有序索引获取有序数据 2、文件排序 在使用explain分析查询的时候,利用有序索引获取有序数据显示Using index。而文件排序显示Using filesort。 1.利用有序索引获取有序数据 取出满足过滤条件作为排序条件的字段,以及可以直接定位到行数据的行指针信息,在 Sort Bu...
数据库索引对查询(order by 语法)性能影响
gydwd的博客
10-27 2093
我们先来看看索引的定义: 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 接下来我们用一个例子来介绍怎么最大程度利用索引来加速我们的查询 1、先来看下要查询的sql SELECT wpo.id, wco.collection_order_no, wpo.picking_order_no, wpo.add_time, wpo.add_admin_name...
order by 原理优化
Meiko记录
10-12 1784
一个使用order by 的简单例子 假设用一张员工表,表结构如下: CREATE TABLE `staff` ( `id` BIGINT ( 11 ) AUTO_INCREMENT COMMENT '主键id', `id_card` VARCHAR ( 20 ) NOT NULL COMMENT '身份证号码', `name` VARCHAR ( 64 ) NOT NULL COMMENT '姓名', `age` INT ( 4 ) NOT NULL COMMENT '年龄', `city` VAR
mysql order by 性能优化_MySQL 如何优化 ORDER BY
weixin_35775608的博客
02-01 1151
在一些情况下,MySQL可以直接使用索引来满足一个 ORDERBY 或 GROUP BY子句而无需做额外的排序。尽管 ORDER BY不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的 ORDER BY 字段在 Where 子句中都被包括了。下列的几个查询都会使用索引来解决ORDER BY 或 GROUP BY 部分:Select * FROM t1 orDER BY ...
浅谈MySQL排序原理与案例分析
12-15
用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序。本文首先会简单介绍SQL如何利用索引避免排序代价,然后会介绍MySQL实现排序的内部...
MySQL排序原理和案例详析
01-19
用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序。本文首先会简单介绍SQL如何利用索引避免排序代价,然后会介绍MySQL实现排序的内部...
MySQL排序原理与案例分析
01-21
用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序。本文首先会简单介绍SQL如何利用索引避免排序代价,然后会介绍MySQL实现排序的内部...
mysql order by 性能_【MySQL性能优化order by (一)
weixin_33365214的博客
01-19 713
前言工作过程中,各种业务需求在访问数据库的时候要求有order by排序。有时候不必要的或者不合理的排序操作很可能导致数据库系统崩溃。如何处理好order by排序呢?本文从原理以及优化层面介绍 order by 。一 MySQLorder by的原理1 利用索引的有序性获取有序数据当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,...
mysql order by 性能优化_MySQL order by性能优化方法实例
weixin_35744849的博客
01-19 267
前言工作过程中,各种业务需求在访问数据库的时候要求有order by排序。有时候不必要的或者不合理的排序操作很可能导致数据库系统崩溃。如何处理好order by排序呢?本文从原理以及优化层面介绍 order by 。一 MySQLorder by的原理1 利用索引的有序性获取有序数据当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,...
MySQL系列:Order by性能优化方法
NIO4444
06-27 487
需求 查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄 CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `city` (`city..
MySQL性能优化order by (一)
cojm55771的博客
08-27 227
前言 工作过程中,各种业务需求在访问数据库的时候要求有order by排序。有时候不必要的或者不合理的排序操作很可能导致数据库系统崩溃。如何处理好order by排序呢?本文从原理以及优化层面介绍 order ...
关于order by的优化
weixin_45097458的博客
11-09 677
order by 关心的问题是排序问题,含义是order by的过程中是使用索引排序(using index)还是产生filsort这种排序 一.在索引列上的排序(可能会是using index,也可能会产生using filesort) A.order by 遵循最佳左前缀原则 a.where后面的内容是个整体,mySql会整体进行优化的,所以可以不考虑顺序 b.虽然会整体优化,但不会对ord...
mysql优化ORDER BY Optimization
哪有什么天生王者,不过是一步一个脚印
06-18 402
Use of Indexes to Satisfy ORDER BY在某些情况下,MySQL可以使用索引来满足ORDER BY子句,以避免执行filesort操作时涉及的额外排序。如果所有未使用的索引部分和所有额外的ORDER BY字段,在WHERE子句中都是和常量比较,那么即使ORDER BY字段与索引不完全匹配,也可以使用索引。假设(key_part1,key_part2)上有索引。以下查询将...
order by 语句怎么优化
ma_nong33的博客
02-02 358
它们的切换通过一个参数控制的这个参数就是max_length_for_sort_data 它表示MySQL用于排序行数据的长度的一个参数,如果单行的长度超过这个值,MySQL 就认为。也就是说,这条SQL语句需要排序。如果要排序的数据小于sort_buffer_size,排序在sort_buffer 内存中完成,如果要排序的数据大于sort_buffer_size,则。:如果sort_buffer内存足够,那效率是最高的,但如果sort_buffer内存不够的话,就需要用到磁盘临时文件,排序性能会很差。
MySQL查询优化之十-ORDER BY优化(ORDER BY Optimization)
itas109的专栏
02-27 5408
MySQL查询优化之十-ORDER BY优化(ORDER BY Optimization) 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:12951803 环境: MySQL版本:5.5.15 操作系统:windows 本文讨论ORDER BY优化(ORDER BY Optimization)。 本文介绍MySQL何时可以使用索引...
oracle orderby多个字段排序原理
06-02
在 Oracle 中,ORDER BY 子句可用于按照一个或多个列对结果进行排序。当多个列用于排序时,Oracle 按照列在 ORDER BY 子句中出现的顺序进行排序。当按照多个列排序时,Oracle 首先按照第一个列进行排序,如果第一个列中有相同的值,那么 Oracle 将按照第二个列进行排序,以此类推。如果所有列都具有相同的值,则结果将按照查询语句中指定的顺序返回。 在排序时,Oracle 使用一个算法来确定每个值的排序顺序。如果 ORDER BY 子句中指定的列是索引列,则 Oracle 使用索引中存储的值来进行排序。如果列不是索引列,则 Oracle 使用排序缓冲区来存储值,并使用排序算法对值进行排序排序缓冲区的大小可以通过初始化参数进行配置。 在进行多列排序时,Oracle 使用一个可以处理多列的排序算法,该算法比单列排序算法更复杂,但它可以有效地处理多列排序。该算法将值存储在排序缓冲区中,并按照 ORDER BY 子句中指定的列的顺序进行排序。如果有多个列具有相同的值,则算法将继续按照 ORDER BY 子句中指定的列进行排序,直到所有列都排序完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • git撤销pull命令 44205
  • jenkins执行脚本npm: command not found解决 21174
  • docker下修改mysql配置文件 19165
  • MySQL出现Access denied for user ‘xxx‘@‘%‘ to database ‘xxxx‘问题 17747
  • order by 排序原理及性能优化 16914

分类专栏

  • elasticSearch 8篇
  • 工作流 2篇
  • 可以商用的Tboot脚手架 2篇
  • 缓存 2篇
  • 生活富能量周报 1篇
  • MySQL只学有用的 5篇
  • 跨年演讲系列 2篇
  • RPC 2篇
  • 系统学习Docker 践行DevOps理念 2篇
  • 数据结构 4篇
  • idea 4篇
  • ssm 1篇
  • 数据库设计 6篇
  • 多线程 13篇
  • dubbo 1篇
  • springboot 6篇
  • mysql 7篇
  • git 3篇
  • java 17篇
  • linux 5篇
  • 设计模式 1篇
  • docker 6篇
  • nginx 1篇
  • 运维 7篇
  • springcloud 5篇
  • RabbitMQ 3篇
  • python 8篇

最新评论

  • jenkins执行脚本npm: command not found解决

    chjiyun: jenkins脚本不继承 环境变量 source 一下就好了

  • Oauth2方式实现单点登录

    llsydn: 需要自己实现/authorize接口吗?不能用oauth2底层写好得接口吗?

  • 分布式限流实战--redis实现令牌桶限流

    konmor: 我就说嘛限制不住的

  • 分布式限流实战--redis实现令牌桶限流

    ld114631028: 这不是令牌桶算法,这是固定窗口算法,而且还有并发问题

大家在看

  • 数组-两个升序数组中位数 952
  • 汉化必备工具 Poedit Pro 翻译编辑器
  • NDIS驱动程序堆栈 832
  • 【JavaSE基础】第八章:面向对象三大特性 1073
  • 深入探究Java自动拆箱与装箱的实现原理

最新文章

  • virtualenv虚拟环境安装
  • 生活富能量第六期
  • MySQL出现Access denied for user ‘xxx‘@‘%‘ to database ‘xxxx‘问题
2022年2篇
2021年7篇
2020年28篇
2019年68篇
2018年12篇
2017年3篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司海西seo排名哪家好云浮企业网站建设报价鹤壁seo价格肇庆网络营销鹤壁网站制作设计多少钱常德网站seo优化报价杭州网站推广哪家好荆门推广网站公司楚雄企业网站制作思茅百姓网标王价格上海百度关键词包年推广达州seo优化和县建站报价云浮建站公司湖州seo网站优化报价坑梓网站推广系统肇庆设计公司网站公司杭州阿里店铺运营价格沈阳企业网站改版推荐大浪网站seo优化多少钱百度关键词包年推广公司嘉兴推广网站哪家好张家界模板网站建设价格宿州企业网站建设报价武汉百度爱采购营口高端网站设计报价聊城关键词按天扣费价格辽阳网站设计模板推荐宿州网站优化按天扣费公司苏州网页制作推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化