MySQL 排序,分组,Limit的优化策略

目录

1. MySQL 中的两种排序方式

2. 排序优化策略

2.1 对排序字段添加索引

2.2 可以和WHERT字段创建联合索引

2.3 优化 FilerSort 排序方式

3. 分组优化策略

3.1 能WHERE不HAVING

3.2 减少ORDER BY,GROUP BY,DISTINCT

3.3 遵照最左前缀法则

4. Limit 优化策略


1. MySQL 中的两种排序方式

在MySQL中,主要支持两种排序方式,分别是 FileSort 和 Index。

Index:索引排序,就是我们给排序的字段添加了索引,因为索引本身就是有序的,所以我们在根据排序的时候就非常省时间了,不需要进行重排序,直接取出数据即可,效率很高。

FileSort:文件排序,在查询到数据之后,因为没有设置索引,所以CPU就需要在内存中进行排序,排好序之后再将数据进行返回,而且数据量如果较大,排序花费时间也会变长;并且,如果数据量非常大,内存中装不下,还需要多次IO操作,先读取一部分数据排序,再读取一部分数据排序,效率较低。

2. 排序优化策略

2.1 对排序字段添加索引

从上面两种排序方式不难看出,Index 索引排序明显是要比 FileSort 内存排序效率要高的,因此我们最好能够在排序字段上添加索引,这样在查询的时候就取出来的就是有序数据,省去了排序时间;

如下所示,我查询 employees 员工表并通过 salary 薪水字段排序,此时还没有给 salary 字段设置索引,查询到107条数据,花费 0.024秒;

 我现在给 salary 薪水字段设置一个普通索引,然后再去做一遍查询

 可以看到,再添加过索引之后,让然查询到了107条数据,时间缩短为0.017秒,可能同学们觉得没有什么差别,这只是因为数据量小的原因,只有一百多条记录,如果有上千条上万条数据,花费的时间一下子就拉开距离了。

2.2 可以和WHERT字段创建联合索引

在SQL语句中,排序通常也会出现WHERE过滤字段,在这种情况下,我们可以考虑给WHERE过滤字段和ORDER BY排序字段建立一个联合索引。如果二者是同一个字段,那就更完美了,就给这个字段建立独立索引;如果是两个字段,建立联合索引,但要注意WHERE过滤如果是范围查找,会导致联合索引中后续索引失效,那么即便设置了排序字段索引,也是用不上的。在设置联合索引时一定要注意满足最左前缀原则,保证索引能够生效。

如下,此时 department_id 和 salary 字段都有索引,但是没有联合索引,所以查询的时候只会用到 department_id 这个字段的索引,

此时我给 department_id 和 salary 建立联合索引再次查询 

查询得到相同的结果,使用联合索引时间0.017秒,比单独使用 department_id索引快了 0.02秒; 

2.3 优化 FilerSort 排序方式

有些时候,我们无法避免的会出现 FileSort 内存排序,其实内存排序有两种方式,分别是双路排序和单路排序。

双路排序:扫描两次磁盘,数据库会先将需要排序的字段IO加载到内存中进行排序,经过排序之后再根据排好序的字段再次IO将完整数据查询出来;

单路排序:数据库会一次性将全部数据加载到内存,然后进行排序,并且在IO的时候是顺序IO读取,读取过后再排序,比双路排序要好。因为双路排序在第二次IO读取数据的时候是根据排好序的顺序读取数据的,是随机IO,明显没有顺序IO要快。但如果数据量较大,就对内存要求较高,但现在内存技术发展迅速,内存已经不值钱了,所以通常建议采用单路排序

3. 分组优化策略

3.1 能WHERE不HAVING

HAVING也是一个过滤关键字,它后面可以使用聚合函数再次过滤,但是建议能在WHERE后面写的过滤条件就不要写在HAVING后面,WHERE过滤之后剩下的少量数据无论是排序还是分组都只会花费很少的时间,所以能WHERE过滤的数据就不要用HAVING。

3.2 减少ORDER BY,GROUP BY,DISTINCT

对于数据库而言,排序,分组,去重这些操作都是比较繁琐耗费资源的,如果将所有操作全部放在数据库中,非常容易出现慢查询,因此我们可以考虑将这些操作放在程序端去做,数据库查询到数据之后,使用程序代码进行排序分组去重;

3.3 遵照最左前缀法则

GROUP BY使用索引的规则几乎与ORDER BY一样,尽量遵循索引最左前缀原则;

4. Limit 优化策略

有些极端情况,如下,我取第十万条记录之后的十条记录,这种情况下数据库就会把所有的数据全部加载到内存中,分页排序之后只取第一万条记录之后的十条记录,做了大量的无用功。

SELECT * FROM employees ORDER BY employee_id LIMIT 10000,10;

那么我们就可以对上面的SQL做修改,直接使用WHERE过滤前一万条数据,从第10001条记录开始取。提高效率,但实际上这种情况很少发生,如果真的有有这种需求,建议直接将10000作为WHERE的一个过滤条件;

SELECT * FROM employees WHERE employee_id > 10000 LIMIT 10000,10;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA的元素组件

注意:关于FPGA的元素这一块儿内容,稍有出入。例如:吉姆莱丁 著,陈会翔 译,由清华大学出版社出版的《构建高性能嵌入式系统》中提到:FPGA通常由查找表、触发器、块RAM、DSP切片、及其他功能元件等元素组成。…

民宿酒店服务预约小程序的作用

民宿往往是旅游者们前往某个城市感受风情常住的地方,也因此在景区或特定地方,总是不乏大小民宿品牌,但除了市场高需求外,商家们所遇的痛点也不少: 1、获客引流难 民宿生意虽然需求量高,但各家品牌众多&am…

c++11中的线程库和包装器

c11 1. 线程库1.1 线程库1.2 锁mutex 2. 包装器2.1 funciton2.2 bind 1. 线程库 1.1 线程库 C11中的线程库提供了一种方便的方式来创建和管理线程。其中,std::thread是一个重要的类,它允许我们创建新线程并控制它们的执行。以下是std::thread的一些重要…

畜牧知识展示宣传小程序的作用是什么

养殖畜牧商家众多,无论企业还是个人都需要科学养殖,对个人商家来说,科学方法或经验很难获取,网上搜索也是五花八门,更没有合适的咨询渠道,而对农场或专业技术公司来说,也需要知识传播取得进一步…

辐射骚扰整改思路及方法:辐射超标与问题定位 ?

某产品首次EMC测试时,辐射、静电、浪涌均失败。本篇文章就“辐射超标与问题定位”问题进行详细讨论。 一、辐射超标 50MHz 、100MHz 、130MHz 、200MHz,4个频点明显超标,其中130MHz 左右最明显,超出 19dB;后将电路板…

电脑怎么恢复删除的文件?恢复文件必备3个方法分享!

“由于我经常需要处理大量的文件,我在电脑里建了一个文件夹放比较重要的文件,但不知道由于我误操作还是什么原因,文件夹里的部分文件消失了,我现在很是烦恼,有什么方法可以帮我恢复删除的文件吗?” 处理电脑…

使用vscode开发uniapp项目常用的辅助插件,提升开发效率

为什么不使用hbuilder开发呢?因为hbuilder对ts和vue3语法支持并不友好,而且代码提示不智能,也不能使用最近很流行的coplit和CodeGeex智能提示,所以就换掉hbulider,使用我们熟悉的vscode开发吧。 第一个:un…

【m98】abseil-cpp的cmake构建

m79的代码有些头文件没有,比如#include "absl/numeric/bits.h"使用m98版本里的代码,支持cmake构建cmake版本 WIN32 DEBUG configure Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.22621. The CXX compiler identification is MSVC 19.37.32…

Find My遥控器|苹果Find My技术与遥控器结合,智能防丢,全球定位

在日常生活中,遥控器是很重要的部分。使用遥控器去操作各种不同的设备,不仅可以省心和省力,同时还能有效增加效率。遥控器是一种无线发射装置,通过现代的数字编码技术,将按键信息进行编码,通过红外线二极管…

RLHF的替代算法之DPO原理解析:从Zephyr的DPO到Claude的RAILF

前言 本文的成就是一个点顺着一个点而来的,成文过程颇有意思 首先,如上文所说,我司正在做三大LLM项目,其中一个是论文审稿GPT第二版,在模型选型的时候,关注到了Mistral 7B(其背后的公司Mistral AI号称欧洲…

figma-如何批量修改字体

一.选择字体 二.批量替换 编辑—>替换相同字体

YOLO目标检测——昏暗车辆检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用:智能交通监控系统、驾驶辅助系统、城市安全监控、自动驾驶系统以及路况分析与规划等数据集说明:昏暗车辆检测数据集,真实场景的高质量图片数据,数据场景丰富,含有图片汽车、卡车、公共汽车标签说明&#…