您当前的位置:首页 > 电脑百科 > 数据库 > 百科

教你一招:orderBy排序优化

时间:2020-01-06 10:36:16  来源:  作者:

在日常的业务开发中,order by 排序是少不了的。但要写出高效的排序SQL,需要先花点精力和时间来了解排序的底层原理,这样才能找到优化排序的好策略。

 

教你一招:orderBy排序优化

 

 

排序的方式

index(索引排序,性能最佳)

尽可能使用索引字段来排序

filesort(文件排序)

2.1 双路排序

MySQL4.1 之前的版本,通过两次扫描磁盘,最终得到数据。先从磁盘中读取行指针和 order by 列,并对它们进行排序,然后扫描已经排好序的列表,按照列表中的值重新从列表中读出(再一次从磁盘中读),要对磁盘进行两次扫描,IO是很耗时的。

2.2 单路排序

MySQL4.1 之后,增加的更优排序算法,从磁盘读取查询需要的所有列,按照order by列在buffer(缓冲区)对它们进行序,然后扫描排序后的列表进行输出,它的效率要更快一些,避免了第二次读取数据(从磁盘读)并且把随机IO变成了顺序IO,但是它会使用过多空间,因为它把每一行都保存在内存中了。
不足:
在sort_buffer中,单路算法比双路算法要多占用很多空间,因为单路算法是把所有字段都取出,所以有可能取出的数据总大小超出了,sort_buffer(MySQL会给每个线程分配一块内存用于排序) 的容量,导致每次只能取 sort_buffer 容量大小的数据,进行排序(创建tmp文件,多路合并),排完再取出。sort_buffer容量太小,再排......从而多次IO操作,本想着省一次IO操作,反而导致了大量的IO操作,反而得不偿失。
使用单路排序满足的条件:
1. 查询语句所取出的字段类型大小总和要小于max_length_for_sort_data2. 排序字段中不包含text和blob类型

优化策略

3.1 只query需要的字段

1. 当query的字段大小总和小于max_length_for_sort_data,而且排序字段不是TEXT|BLOB类型,会使用单路排序算法,否则使用多路排序算法。2. 两种算法的数据都有可能超出sort_buffer的容量,超出之后,创建tmp文件进行合并排序,导致多次的IO,但是使用单路排序的风险更大,所以要提高sort_buffer_size。

3.2 尝试提高sortbuffersize

不管使用哪种算法,提高这个参数都会提高效率,要根据系统的自身能力去提高,因为这个参数是针对每个进程的。

3.3 尝试提高maxlengthforsortdata

提高这个参数,会增加用改进算法的概率。但如果设置得太高,数据总容量超出sort_buffer_size的概率会增大,明显症状是高的磁盘IO活动和低的处理器使用率。

实例

数据表

*************************** ***************************         Table: userCreate   Table: CREATE TABLE `user` (      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,      `name` varchar(20) NOT NULL,      `age` int(10) NOT NULL DEFAULT '0',      `city` varchar(20) NOT NULL,      `addr` varchar(50) DEFAULT NULL,      PRIMARY KEY (`id`),      KEY `idx_name_age_city` (`name`,`age`,`city`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

order by能使用索引最左前缀

* select id,name,age,city from user order by name;* select id,name,age,city from user order by name,age,city;* explain select id,name,age,city from user order by name desc,age desc,city desc;
教你一招:orderBy排序优化

 


教你一招:orderBy排序优化

 


教你一招:orderBy排序优化

 

如果where使用索引的最左前缀定义为常量,则order by 能使用索引

* select * from user where name = 'zhangsan' order by age,city;* select * from user where name = 'zhangsan' and age = 20 order by city;* select * from user where name = 'zhangsan' and age > 20 order by age,city;
教你一招:orderBy排序优化

 


教你一招:orderBy排序优化

 


教你一招:orderBy排序优化

 

不能使用索引进行排序

select * from user order by name,age,city;//query*字段select * from user order by addr;//非索引字段排序select * from user order by name,addr;//含有非索引字段select * from user where age = 20 order by city;//跳过了name字段,违反最左前缀法则select * from user where name = 'zhangsan' order by city;//跳过了age字段,违反最左前缀法则select * from user where name = 'zhangsan' order by age,addr;//含有非索引字段
教你一招:orderBy排序优化

 


教你一招:orderBy排序优化

 


教你一招:orderBy排序优化

 


教你一招:orderBy排序优化

 


教你一招:orderBy排序优化

 



Tags:order   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
这篇文章我们来谈谈字体设置Font&边框Border的基础用法。1.字体设置Font1).字体系列<div style=&#39;font-family: sans-serif normal&#39;></div>可用字体:SerifSans-serifM...【详细内容】
2020-09-07  Tags: order  点击:(77)  评论:(0)  加入收藏
前言 在实际的开发中一定会碰到根据某个字段进行排序后来显示结果的需求,但是你真的理解order by在 Mysql 底层是如何执行的吗? 假设你要查询城市是苏州的所有人名字,并且按照...【详细内容】
2020-04-15  Tags: order  点击:(73)  评论:(0)  加入收藏
0 问题描述在MySQL中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10条数据,limit(10,10)表示列出第二页。但是,当limit遇到order by的时候,可能会出...【详细内容】
2020-02-26  Tags: order  点击:(77)  评论:(0)  加入收藏
在日常的业务开发中,order by 排序是少不了的。但要写出高效的排序SQL,需要先花点精力和时间来了解排序的底层原理,这样才能找到优化排序的好策略。 排序的方式index(索引排序...【详细内容】
2020-01-06  Tags: order  点击:(105)  评论:(0)  加入收藏
如上,我们在MySQL 中常用 order by 来进行排序,再结合使用 limit 来实现数据的分页获取,然而这种写法却隐藏着较深的使用陷阱&mdash;&mdash;在排序字段有数据重复的情况下,可...【详细内容】
2019-09-09  Tags: order  点击:(165)  评论:(0)  加入收藏
原理CSS 盒模型 一个盒子包括:margin+border+padding+content上下左右边框交界处出呈现平滑的斜线。 利用这个特点, 通过设置不同的上下左右边框宽度或者颜色可以得到小三角,...【详细内容】
2019-09-04  Tags: order  点击:(158)  评论:(0)  加入收藏
文章转载自yangyidba , 作者 杨奇龙一 前言为什么是再说呢?因为前面已经写过 《order by 原理以及优化》 ,介绍 order by 的基本原理以及优化。如果觉得对 order by 原理了解不...【详细内容】
2019-08-14  Tags: order  点击:(193)  评论:(0)  加入收藏
问题描述在MySQL中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10条数据,limit(10,10)表示列出第二页。但是,当limit遇到order by的时候,可能会出现翻到...【详细内容】
2019-08-12  Tags: order  点击:(443)  评论:(0)  加入收藏
在程序设计当中,我们很多场景下都会用 group by 关键字。比如在分页读取数据时,为了避免重复扫描记录,这就是必须要使用 group by 了。比如我们使用如下 DDL 创建表:CREATE TAB...【详细内容】
2019-05-15  Tags: order  点击:(516)  评论:(0)  加入收藏
▌简易百科推荐
1增1.1【插入单行】insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values (&#39;开心朋朋&#39;,&#39;男&#39;,&#39;1980/6/15&#3...【详细内容】
2021-12-27  快乐火车9d3    Tags:SQL   点击:(2)  评论:(0)  加入收藏
最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫, 不知道各种写法孰优孰劣,该选用哪种写法,以及各种写法的优缺点,本文以一个简单的查询...【详细内容】
2021-12-23  linux上的码农    Tags:sql   点击:(9)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的HasorDB 是一个全功能数据库访问工具,提供对象映射、丰...【详细内容】
2021-12-22  GitHub精选    Tags:HasorDB   点击:(5)  评论:(0)  加入收藏
作者丨Rafal Grzegorczyk译者丨陈骏策划丨孙淑娟【51CTO.com原创稿件】您是否还在手动对数据库执行各种脚本?您是否还在浪费时间去验证数据库脚本的正确性?您是否还需要将...【详细内容】
2021-12-22    51CTO  Tags:Liquibase   点击:(4)  评论:(0)  加入收藏
场景描述:由于生产环境的表比较复杂,字段很多。这里我们做下简化,只为说明今天要聊的问题。有两张表 tab1,tab2: tab1 数据如下: tab2 数据如下: 然后给你看下,我用来统计 name=&#3...【详细内容】
2021-12-20  Bald    Tags:SQL   点击:(7)  评论:(0)  加入收藏
前言知识无底,学海无涯,知识点虽然简单,但是比较多,所以将MySQL的基础写出来,方便自己以后查找,还有就是分享给大家。一、SQL简述1.SQL的概述Structure Query Language(结构化查...【详细内容】
2021-12-16  谣言止于独立思考    Tags:SQL基础   点击:(13)  评论:(0)  加入收藏
前言作为一名测试工程师,工作中在对测试结果进行数据比对的时候,或多或少要和数据库打交道的,要和数据库打交道,那么一些常用的 SQL 查询语法必须要掌握。最近有部分做测试小伙...【详细内容】
2021-12-14  柠檬班软件测试    Tags:SQL   点击:(15)  评论:(0)  加入收藏
话说C是面向内存的编程语言。数据要能存得进去,取得出来,且要考虑效率。不管是顺序存储还是链式存储,其寻址方式总是很重要。顺序存储是连续存储。同质结构的数组通过其索引表...【详细内容】
2021-12-08  小智雅汇    Tags:数据存储   点击:(18)  评论:(0)  加入收藏
概述DBConvert Studio 是一款强大的跨数据库迁移和同步软件,可在不同数据库格式之间转换数据库结构和数据。它将成熟、稳定、久经考验的 DBConvert 和 DBSync 核心与改进的现...【详细内容】
2021-11-17  雪竹聊运维    Tags:数据库   点击:(26)  评论:(0)  加入收藏
一、前言 大家好,我是小诚,《从0到1-全面深刻理解MySQL系列》已经来到第四章,这一章节的主要从一条SQL执行的开始,由浅入深的解析SQL语句由客户端到服务器的完整执行流程,最...【详细内容】
2021-11-09  woaker    Tags:SQL   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条