SQL高级之order by优化

news2024/11/20 10:30:38

简介

  • MySQL支持两种方式的排序,FileSort和Index,其中Index的效率较高
  • 他是指MySQL扫描索引本身完成排序。FileSort方式效率较低

使用Index

一般情况下ORDER BY满足两种情况会使用索引排序

  1. ORDER BY语句使用索引最左前列
  2. 使用where子句与order by 子句条件列组合满足索引最左前列
    • where子句中如果出现索引的范围查询(explain中出现range)会导致order by 索引失效

建表

CREATE TABLE tblA(
  id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  age INT,
  birth TIMESTAMP NOT NULL,
  NAME VARCHAR(200)
);
 
INSERT INTO tblA(age,birth,NAME) VALUES(22,NOW(),'abc');
INSERT INTO tblA(age,birth,NAME) VALUES(23,NOW(),'bcd');
INSERT INTO tblA(age,birth,NAME) VALUES(24,NOW(),'def');
 
CREATE INDEX idx_A_ageBirth ON tblA(age,birth,NAME);
 
SELECT * FROM tblA; 

查询如下
在这里插入图片描述

  • 我们在age、birth、name上面建立了索引

例子

最左前列

EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY age;

在这里插入图片描述

EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY age,birth;

在这里插入图片描述

EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY birth;

在这里插入图片描述

EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY birth,age;

在这里插入图片描述
经过上面的四个例子,我们会发现只要用到了最左前列的索引,那么他就会不会用到filesort排序(前两个)

总结

假设 KEY a_b_c(a,b,c)

order by 能使用索引最左前缀

  • order by a
  • order by a,b
  • order by a,b,c
  • order by a desc ,b desc,c desc

where使用最左前缀

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

  • where a = const order by b,c
  • where a = const and b = const order by c
  • where a = const order by b,c
  • where a = const and b > const order by b,c

不能使用索引排序

  1. order by a asc , b desc , c desc : 排序不一致
  2. where g = const order by b,c:丢失索引a
  3. where a = const order by c:丢失索引b
  4. where a = const order by a,d:d不是索引的一部分
  5. where a in (…) order by b,c:对于排序来说,多个相等的条件也是范围查询

filesort

如果不在索引列上,通常,filesort有两种算法:双路排序和单路排序

双路排序

  1. MYSQL4.1之前是使用的双路排序,字面意思就是两次扫描磁盘,最终得到数据
  2. 去读行指针和order by列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中兑取对应的数据输入
  3. 从磁盘中取排序字段,在buffer进行排序,在从磁盘去其他字段

取一批数据,要对磁盘进行两次扫描,总所周知,I/O是非常耗时的,所以在mysql4.1之后,出现了第二种改进的算法,就是单路排序

单路排序

  1. 从磁盘读取查询需要的所有列,按照order by列在buffer对他们进行排序,然后扫描排序后的列表进行输出
  2. 他的效率更快一些,因为避免了第二次读取数据。并且把随机的IO变成了顺序的IO,但是他会使用更多的空间,因为他把每一行都保存在了内存中。

对比

  1. 总体而言,单路好过双路
  2. 但也存在着某种问题,单路排序要比多路排序需要更多的内存空间,有可能超出了sort_buffer的容量,导致了每次只能去sort_buffer容量大小的数据,进行排序(创建tmp文件,多路合并),排完再去sort_buffer容量大小,再排…从而导致多次IO

问题解决

为了解决单路排序的问题,我们可以用下面的措施进行解决

  1. 增大sort_buffer_size参数设置(他是专门用于单路排序内存大小的)
    • 不管用哪种算法,提高这个参数都会提高效率,当然,要根据系统的能力去提高,因为这个参数是针对每个进程的
  2. 增大max_length_for_sort_data参数的设置(专门用于单词排序字段大小)
    • 提高这个参数, 会增加用改进算法的概率。但是如果设的太高,数据总容量超出sort_buffer_size的概率就增大,明显症状是高的磁盘I/O活动和低的处理器使用率.
  3. 去掉select后面不必要的字段,如果select后面的字段多了,排序的时候也会跟着一起,很占内存,去掉没有用的
    • 当Query的字段大小总和小于max_length_for_sort_data 而且排序字段不是 TEXT|BLOB 类型时,会用改进后的算法——单路排序, 否则用老算法——多路排序。
    • 两种算法的数据都有可能超出sort_buffer的容量,超出之后,会创建tmp文件进行合并排序,导致多次I/O,但是用单路排序算法的风险会更大一些,所以要提高sort_buffer_size。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

复习之linux虚拟化的介绍

一、虚拟化客户端及工具的安装 1.在虚拟机westos中列出: ps:虚拟机中安装虚拟机无意义,这里指是做实验看清楚虚拟机的创建! # dnf group list --hidden irtualization Client :虚拟化客户端 Virtualization Tools &…

稳定性治理二,稳定性分析

目录 重新认识系统稳定性(SLA与系分)稳定性分析(单点,容量和性能,依赖,数据保护,安全,资损,弹性能力,业务连续性,变更控制)压测方案&a…

面向对象3构造器

类的成员之三:构造器(Constructor) 我们 new 完对象时,所有成员变量都是默认值,如果我们需要赋别的值,需要 挨个为它们再赋值,太麻烦了。我们能不能在 new 对象时,直接为当前对象的 某个或所有成员变量直接…

美团买菜基于 Flink 的实时数仓建设

摘要:本文整理自美团买菜实时数仓技术负责人严书,在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为四个部分: 1. 背景介绍 2. 技术愿景和架构设计 3. 典型场景、挑战与应对 4. 未来规划 Tips:点击「阅读原文」免…

ReentrantLock实现原理-条件锁

在前两篇文章中,我们了解了ReentrantLock内部公平锁和非公平锁的实现原理,可以知道其底层基于AQS,使用双向链表实现,同时在线程间通信方式(2)中我们了解到ReentrantLock也是支持条件锁的,接下来我们来看下,…

ISO21434 网络安全支持终止与退役(十一)

目录 一、概述 二、目标 三、网络安全支持终止 3.1 输入 3.2 要求和建议 3.3 输出 四、退役 4.1 输入 4.1.1 先决条件 4.1.2 进一步支持信息 4.2 要求和建议 4.3 输出 一、概述 退役不同于结束网络安全支持。一个组织可以结束对一个项目或组件的网络安全支持&#…

【Linux】常用命令总结

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 1.登录操作 2.操作系统 a.os是什么? b.好的操作系统的衡量指标?为什么要有操作系统? 3.Linux下的基本指令 a.ls指令 b.pwd指令 c.cd指令 d…

SB领导的特征

越是SB领导,往往越有这9大特征,难怪员工不服气。 孔子曾说过:“视其所以,观其所由、察其所安、人焉善哉?” 领导也是如此,想要判断领导是不是SB,关键就看他的所作所为。 越是“SB”的领导&#…

在CRM系统中如何获取联系人的信息?

CRM客户管理系统可以有效应对企业对联系人管理的需求,帮助销售人员随时随地查阅、记录、修改联系人,为业务开展做好铺垫。CRM中联系人是什么?如何获取联系人信息? 1.CRM中联系人是什么? CRM系统联系人指的是沟通对象…

薅羊毛!阿里云免费GPU云主机畅玩AI绘画,免费领取阿里云v100显卡搭建AI绘画利器Stable Diffusion

❝ AI绘画利器Stable Diffusion,因为对电脑显卡,磁盘,内存等都有一些限制,导致大部分人望而止步,所以小编今天教大家免费领取阿里云的免费显卡服务器,免费试用3个月,以方便各位快速学习与使用。 ❞ 领取免费…

MapReduce编程

Hadoop的MapReduce计算框架 概述 MapReduce计算框架是一种计算框架,用于计算处理大规模的数据集,他将数据分成小块,然后在集群中的多个节点上并行处理这些块MapReduce框架是由两个组件组成:Map和Reduce Map任务将输入数据分解成…

团队管理之性能实施团队日志12

这几天算是多事之秋。本来就有几个严重的问题天天在折腾。 还是出现了各种差错。 其实对于做项目来说,就是这样,总会有紧要的事情突然冒出来。 我倒是习惯了这种状态。 只是时间不等人。 这两天在写各系统的最终报告。结果写到某个系统的时候发现&#…

零基础学Python,最受推荐的10本Python书籍

目录 适合初学者的最佳Python书籍1、《Python编程:从入门到实践》2、《Head-First Python (2nd edition)》3、《“笨方法”学Python》4、《Python程序设计(第3版)》 最适合初学者的免费Python书籍5、《像计算机科学家一样思考Python (第2版)》…

学习【菜鸟教程】【C++ 继承】(未完)

链接 1. 教程原文 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,您不需要重新编写新的…

0基础学习VR全景平台篇第41篇:编辑器底部菜单-素材管理

大家好,欢迎观看蛙色VR官方系列——后台使用课程! 本期为大家带来蛙色VR平台,底部菜单—素材管理功能操作。 功能位置示意 一、本功能将用在哪里? 素材管理,主要是对场景列表相关的基础操作做一个详细的讲解&#xf…

自研API 网关 - 媲美美团这套Shepherd网关架构!

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 我说:“很多互联网大厂,很少基于 SpringMVC 模块对外提供 WEB 服务的 HTTP 接口!” 一下炸窝…

【瑞萨RA MCU创意氛围赛】基于FSP库开发 --- Qt遥控小车

文章目录 引言一、产品功能介绍二、硬件清单三、软件设计1. RASC2. Keil2. Qt 四、视频展示 引言 很高兴能够加入“野火”这个大家庭中,且能有机会参加第一期的【瑞萨RA MCU创意氛围赛】,在此之前,我竟都没能了解瑞萨这个产品,是…

如何计算一个实例占用多少内存?

我们都知道CPU和内存是程序最为重要的两类指标,那么有多少人真正想过这个问题:一个类型(值类型或者引用类型)的实例在内存中究竟占多少字节?我们很多人都回答不上来。其实C#提供了一些用于计算大小的操作符和API&#…

【026】C++的内联函数、函数重载、函数的默认参数与占位参数

C的内联函数、函数重载、函数的默认参数与占位参数 引言一、内联函数1.1、声明内联函数1.2、宏函数和内联函数的区别1.3、内联函数的注意事项 二、函数重载2.1、函数重载的概述2.2、函数重载的条件2.3、函数重载的底层实现原理 三、函数的默认参数四、占位参数五、extern "…

STM32单片机TFT显示AD9833 DDS信号发生器语音播报正弦波方波三角波

实践制作DIY- GC0146---TFT显示AD9833 DDS信号发生器 基于STM32单片机设计---TFT显示AD9833 DDS信号发生器 二、功能介绍: 硬件组成:STM32F103C系列最小系统板 1.8寸TFT彩屏AD9833信号模块4*4矩阵键盘DY-SV17F语音播报模块 1.通过4*4键盘来设定频率值和…