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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

更新版PHP神算网八字算命星座解梦周易占卜程序源码/PC+H5移动端整站适配/PHP源码带手机版

源码简介: 这个是更新版PHP神算网八字算命星座解梦周易占卜程序源码,能够在PCH5移动端整站适配。作为H5付费算命PHP源码,八字算命网站源码,功能很多强大实用。 2023.3 更新记录: 1、更新了23年属相信息;…

pytorch实现 --- 手写数字识别

本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在Pytorch&#xff…

海康威视解码器维修DS-6900系列DS-6916UD

海康威视解码器常见维修型号:DS-6916UD/DS-6901/DS-6904/DS-6908/DS-6910/DS-6912UD/6A16 DS-6A16UD 产品类型:视音频解码器纠错 I/O接口:输入 DVI-I纠错;输出 VGA,BNC纠错;音频输入 HDMI纠错 产品特性 …

安科瑞关于新能源电动汽车有序充电的对策-安科瑞黄安南

摘要 随着我国能源战略发展以及低碳行动的实施,电动汽车已逐步广泛应用,而电动汽车的应用非常符合当今社会对环保意识的要求,以及有效节省化石燃料的消耗。由于其没有污染排放的优点以及政府部门的关注,电动汽车将成为以后出行的…

【网络知识必知必会】聊聊数据链路层以太网

文章目录 前言1. 认识以太网2. 以太网帧格式已经有了ip地址, 为什么还要有 mac 地址呢?认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对于TCP协议的影响 总结 前言 本文继续来聊聊网络传输中数据链路层中的一个代表协议, 以太网. 以太这个词其实最早出现在物理学当中, 在早…

基于SpringAOP实现自定义接口权限控制

文章目录 一、接口鉴权方案分析1、接口鉴权方案2、角色分配权限树 二、编码实战1、定义权限树与常用方法2、自定义AOP注解3、AOP切面类(也可以用拦截器实现)4、测试一下 一、接口鉴权方案分析 1、接口鉴权方案 目前大部分接口鉴权方案,一般…

HTML5的语义元素

HTML5语义元素&#xff1a; HTML5提供新的语义元素来明确一个web页面的不同部分&#xff1a;<head>、<nav>、<section>、<article>、<aside>、<figcation>、<figure>、<footer>。 1&#xff09;、<section>元素&#x…

dockerfile避坑笔记(VMWare下使用Ubuntu在Ubuntu20.04基础镜像下docker打包多个go项目)

一、docker简介 docker是一种方便跨平台迁移应用的程序&#xff0c;通过docker可以实现在同一类操作系统中&#xff0c;如Ubuntu和RedHat两个linux操作系统中&#xff0c;实现程序的跨平台部署。比如我在Ubuntu中打包了一个go项目的docker镜像&#xff08;镜像为二进制文件&am…

2023年11月5日网规考试备忘

早上题目回忆&#xff1a; pki体系 ipsec&#xff0c;交换安全&#xff08;流量抑制&#xff09; aohdlc bob metclaf —ethernet pon tcp三次握手 OSPF lsa&#xff1f;交换机组ospf配置问题&#xff0c;ping网关可通&#xff0c;AB不通 raid6 300G*8 网络利用率 停等协议10…

【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入输出、缺省参数、函数重载)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】十一、归并排序(比较排序)的讲解和实现 &#xff08;递归版本 非递归版本 -- C语言实现&#xff09;-CSDN博客 引入&#xff1a;什么是C C语言是结构化和模块化的…

剑指JUC原理-9.Java无锁模型

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

Flink SQL 窗口聚合详解

1.滚动窗⼝&#xff08;TUMBLE&#xff09; **滚动窗⼝定义&#xff1a;**滚动窗⼝将每个元素指定给指定窗⼝⼤⼩的窗⼝&#xff0c;滚动窗⼝具有固定⼤⼩&#xff0c;且不重叠。 例如&#xff0c;指定⼀个⼤⼩为 5 分钟的滚动窗⼝&#xff0c;Flink 将每隔 5 分钟开启⼀个新…

如何在知识付费系统小程序开发中实现社区互动和用户参与

在知识付费系统小程序的开发中&#xff0c;实现社区互动和用户参与可以通过以下步骤实现&#xff1a; 1. 建立用户身份验证和管理系统 // 后端示例代码&#xff08;Node.js&#xff09; // 用户注册 app.post(/register, (req, res) > {const { username, email, passwor…

如何在电脑上制作可视化待办任务清单?

在现代高效工作的节奏下&#xff0c;上班族们需要管理大量的待办任务和工作事项。可视化的待办任务清单能够使我们清晰地了解自己的任务进度和工作优先级。每天打开电脑&#xff0c;我们可以直观地看到还有哪些任务需要完成&#xff0c;避免遗漏和混乱。而如何将这些任务清单可…

数据结构之堆的实现(图解➕源代码)

一、堆的定义 首先明确堆是一种特殊的完全二叉树&#xff0c;分为大根堆和小根堆&#xff0c;接下来我们就分别介绍一下这两种不同的堆。 1.1 大根堆&#xff08;简称&#xff1a;大堆&#xff09; 在大堆里面&#xff1a;父节点的值 ≥ 孩子节点的值 我们的兄弟节点没有限制&…

Nacos2.2.3版本运行startup.cmd出现闪退,无错误信息解决方法

Nacos2.2.3版本运行startup.cmd出现闪退&#xff0c;无错误信息解决方法 一、问题描述二、解决方法 一、问题描述 当我下载好nacos2.2.3版解压之后&#xff0c;直接双击startup.cmd出现闪退&#xff0c;而且 没有错误提示信息。后来经过一番搜索尝试&#xff0c;终于解决了自己…

Spring 中 @Qualifier 注解还能这么用?

今天想和小伙伴们聊一聊 Qualifier 注解的完整用法&#xff0c;同时也顺便分析一下它的实现原理。 说到 Qualifier&#xff0c;有的小伙伴可能会觉得诧异&#xff0c;这也只得写一篇文章&#xff1f;确实&#xff0c;但凡有点开发经验&#xff0c;多多少少可能都遇到过 Qualif…

《算法通关村—轻松搞定合并二叉树》

《算法通关村—轻松搞定合并二叉树》 描述 leetcode 617 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵…

酒水展示预约小程序的效果如何

酒的需求度非常高&#xff0c;各种品牌、海量经销商组成了庞大市场&#xff0c;而在实际经营中&#xff0c;酒水品牌、经销商、门店经营者等环节往往也面临着品牌传播拓客引流难、产品展示预约订购难、营销难、销售渠道单一等痛点。 那么商家们应该怎样解决呢&#xff1f; 可以…

Vue3多页面开发实践

前言&#xff1a; 项目需求&#xff0c;把项目中的一个路由页面单摘出来作为一个新的项目。项目部署到服务器上后&#xff0c;通过一个链接的形式可以直接访问到新项目的页面。 解决方式&#xff1a; 使用Vue多页面方式打包项目 实现步骤&#xff1a; 1、在项目的src目录下&am…