SQL查询优化---子查询优化、排序分组优化、覆盖索引优化

news2024/12/16 21:03:22

1、子查询优化

1、尽量不要使用not in 或者 not exists
取所有不为掌门人的员工,按年龄分组 ,每个年龄段多少人

  SELECT SQL_NO_CACHE age,count(*)  FROM emp a WHERE  id  NOT  IN(SELECT ceo FROM dept b2 WHERE ceo IS NOT NULL)
  group by age 
  having count(*)<10000

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、用left outer join on xxx is null 替代

  EXPLAIN SELECT SQL_NO_CACHE age,count(*) FROM  emp a LEFT OUTER JOIN dept b ON a.id =b.ceo
  WHERE    b.ceo IS   NULL
  group by age 
  having count(*)<10000

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、排序分组优化

1、排序案例

create index idx_age_deptid_name on emp (age,deptid,name)

以下 是否能使用到索引,能否去掉using filesort

1、explain  select SQL_NO_CACHE * from emp order by age,deptid; 
2、 explain  select SQL_NO_CACHE * from emp order by age,deptid limit 10; 
 #无过滤 不索引
3、  explain  select * from emp where age=45 order by deptid;
4、explain  select * from emp where age=45 order by   deptid,name; 
5、explain  select * from emp where age=45 order by  deptid,empno;
6、explain  select * from emp where age=45 order by  name,deptid;
7、 explain select * from emp where deptid=45 order by age;
#顺序错,必排序
8、  explain select * from emp where age=45 order by  deptid desc, name desc ;
9、 explain select * from emp where age=45 order by  deptid asc, name desc ;
  #方向反 必排序

2、ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序

3、索引选择
执行案例前先清除emp上的索引,只留主键

#查询 年龄为30岁的,且员工编号小于101000的用户,按用户名称排序
SELECT SQL_NO_CACHE * FROM emp WHERE age =30 AND empno <101000 ORDER BY NAME ;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#结论:很显然,type 是 ALL,即最坏的情况。Extra 里还出现了 Using filesort,也是最坏的情况。优化是必须的。
#开始优化:
思路: 尽量让where的过滤条件和排序使用上索引
但是一共两个字段(deptno,empno)上有过滤条件,一个字段(ename)有索引
1、我们建一个三个字段的组合索引可否?
在这里插入图片描述

CREATE INDEX idx_age_empno_name ON emp(age,empno,NAME);

我们发现using filesort 依然存在,所以name 并没有用到索引。
原因是因为empno是一个范围过滤,所以索引后面的字段不会再使用索引了。
所以我们建一个3值索引是没有意义的
那么我们先删掉这个索引,DROP INDEX idx_age_empno_name ON emp
为了去掉filesort我们可以把索引建成

CREATE INDEX idx_age_name ON emp(age,NAME);

在这里插入图片描述

也就是说empno 和name这个两个字段我只能二选其一。
这样我们优化掉了 using filesort。
执行一下sql
在这里插入图片描述
在这里插入图片描述

速度果然提高了4倍。

但是
如果我们选择那个范围过滤,而放弃排序上的索引呢
建立

DROP INDEX idx_age_name ON emp
create index idx_age_eno on emp(age,empno); 
 

在这里插入图片描述
在这里插入图片描述

果然出现了filesort,而且type还是range光看字面其实并不美好。
我们来执行以下sql
在这里插入图片描述
在这里插入图片描述

结果竟然有 filesort的 sql 运行速度,超过了已经优化掉 filesort的 sql ,而且快了好多倍。

原因是所有的排序都是在条件过滤之后才执行的,所以如果条件过滤了大部分数据的话,几百几千条数据进行排序其实并不是很消耗性能,即使索引优化了排序但实际提升性能很有限。 相对的 empno<101000 这个条件如果没有用到索引的话,要对几万条的数据进行扫描,这是非常消耗性能的,所以索引放在这个字段上性价比最高,是最优选择。

结论: 当范围条件和group by 或者 order by 的字段出现二选一时 ,优先观察条件字段的过滤数量,如果过滤的数据足够多,而需要排序的数据并不多时,优先把索引放在范围字段上。反之,亦然。

4、如果不在索引列上,filesort有两种算法:mysql就要启动双路排序和单路排序

1、双路排序
MySQL 4.1之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据,
读取行指针和orderby列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据输出。
从磁盘取排序字段,在buffer进行排序,再从磁盘取其他字段。

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

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

4、结论及引申出的问题
由于单路是后出的,总体而言好过双路
但是用单路有问题
在sort_buffer中,方法B比方法A要多占用很多空间,因为方法B是把所有字段都取出, 所以有可能取出的数据的总大小超出了sort_buffer的容量,导致每次只能取sort_buffer容量大小的数据,进行排序(创建tmp文件,多路合并),排完再取取sort_buffer容量大小,再排……从而多次I/O。
本来想省一次I/O操作,反而导致了大量的I/O操作,反而得不偿失。

5、优化策略
增大sort_buffer_size参数的设置。
增大max_length_for_sort_data参数的设置。
减少select 后面的查询的字段。

6、提高Order By的速度

  1. Order by时select * 是一个大忌只Query需要的字段, 这点非常重要。在这里的影响是:
    1.1 当Query的字段大小总和小于max_length_for_sort_data 而且排序字段不是 TEXT|BLOB 类型时,会用改进后的算法——单路排序, 否则用老算法——多路排序。
    1.2 两种算法的数据都有可能超出sort_buffer的容量,超出之后,会创建tmp文件进行合并排序,导致多次I/O,但是用单路排序算法的风险会更大一些,所以要提高sort_buffer_size。

  2. 尝试提高 sort_buffer_size
    不管用哪种算法,提高这个参数都会提高效率,当然,要根据系统的能力去提高,因为这个参数是针对每个进程的 1M-8M之间调整

  3. 尝试提高 max_length_for_sort_data
    提高这个参数, 会增加用改进算法的概率。但是如果设的太高,数据总容量超出sort_buffer_size的概率就增大,明显症状是高的磁盘I/O活动和低的处理器使用率. 1024-8192之间调整

5、GROUP BY关键字优化
group by 使用索引的原则几乎跟order by一致 ,唯一区别是groupby 即使没有过滤条件用到索引,也可以直接使用索引。

3、覆盖索引优化

什么是覆盖索引?
简单说就是,select 到 from 之间查询的列 <=使用的索引列+主键
在这里插入图片描述

explain select * from emp where name like '%abc';

在这里插入图片描述
在这里插入图片描述

使用覆盖索引后

在这里插入图片描述

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

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

相关文章

NFC读卡器ST25R3911B-AQWT、ST25R3917B-AQET、ST25R3919B-AQET产品描述、功能框图

一、ST25R3911B 1.4 W功耗可支持VHBR和AAT的高性能HF读卡器 / NFC发起设备 ST25R3911B 是高度集成的NFC发起设备 / HF读卡器IC&#xff0c;包括模拟前端&#xff08;analog front end&#xff0c;AFE&#xff09;和一个高度集成的数据帧系统&#xff0c;可用于ISO 18092&#…

房产网源码 房产中介小程序源码 房产门户网站源码

房产网源码 房产中介小程序源码 房产门户网站源码 功能介绍&#xff1a; 一、付费发布信息 支持付费发布、刷新、置顶房源信息&#xff1b;二、个人发布信息 支持个人和房产经纪人发布房源信息&#xff1b;三、新房楼盘模块 支持新房楼盘功能&#xff0c;后台添加…

数字调制与星座图

文章目录 数字调制什么是调制&#xff1f;为什么调制&#xff1f;数字调制幅移键控 (ASK)频移键控 (FSK)相移键控 (PSK)二相相移键控(BPSK)正交相移键控(QPSK)补充&#xff1a;什么是相位 星座图IQ调制与解调IQ调制IQ解调IQ调制与解调的原理与过程IQ调制的应用举例 正交幅度调制…

ICC2:分段长tree的流程

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 分段长tree操作起来方法很多,这里提供两种ICC2分段长tree的方法。有需要的可以试试。 1.用原始sdc长一遍tree,找得到要做subtree部分,并预估latency值。 2.把sdc中添加subtree clock,subtree是…

使用Intersection Observer API 检测元素是否出现在可视窗口

使用Intersection Observer API 检测元素是否出现在可视窗口 API解读&#xff1a; Intersection Observer API提供了一种异步检测目标元素与祖先元素或视口(可统称为根元素)相交情况变化的方法。 注意点&#xff1a;因为该 API 是异步的&#xff0c;它不会随着目标元素的滚动…

基于springboot实现校园交友网站管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园交友网站管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生…

COSCon'23媒体和社区合作伙伴正式公布!百川相聚,潮汇大海,邀您天府之城共话开源!...

一年一度的开源盛会&#xff0c;COSCon23 第八届中国开源年会&#xff0c;将于10月28~29日&#xff0c;在四川成都市高新区菁蓉汇召开&#xff01;本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01; 如往年一样&#xff0c;作为中国最大的非营利…

独创变频杀毒(血影内核) 瑞星杀毒软件V16保驾护航

下载地址&#xff1a;https://user.qzone.qq.com/512526231/main

MySQL知识总结(内附超详细知识框架图)

MySQL知识总结 博友们&#xff0c;你们好&#xff01;博主最近对MySQL相关的知识进行了复盘&#xff0c;并通过思维导图的方式提取出了MySQL的核心知识点&#xff0c;现将复盘结果分享给大家&#xff0c;希望能够对大家学习MySQL有所帮助。 下面博主将MySQL各大模块的思维导图…

CDN是如何一步步壮大到现在这样的

当我们浏览网页、观看在线视频或下载文件时&#xff0c;CDN&#xff08;内容分发网络&#xff09;已经成为网络世界中不可或缺的一部分。本文将探讨CDN的发展历程&#xff0c;其工作原理&#xff0c;以及它如何利用不同地区来提供更快速、可靠的内容交付服务。 CDN的发展历程 过…

HTML5+CSS3+JS小实例:带密码灯照射的登录界面

实例:带密码灯照射的登录界面 技术栈:HTML+CSS+JS 字体图标库:Font Awesome 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name=&…

SOLIDWORKS® 2024 新功能 - SIMULATION

1、增强型轴承接头 • 通过指定压缩、拉伸和弯曲的刚度&#xff0c;轻松创建自定义轴承接头。 • 通过向非线性和大型位移算例添加自定义条件&#xff0c;提高模拟精度。 优点 使用功能强大的接口&#xff0c;更轻松、更准确地设置模拟过程&#xff0c;并加快模拟速度。 2、…

计算机行业已经进入寒冬?云计算帮你解决就业难题!

近几年国内外互联网行业都有大动作&#xff0c;国内外互联网企业都开始了裁员。 “谷歌宣布解雇1.2万名员工&#xff0c;占总员工数的6%” “微软宣布计划在第三财季裁员1万人” “Meta开启两轮万人裁员&#xff0c;总计裁员约2.1万” “据传阿里即将裁员25%” “OPPO宣布哲库…

SpringBoot整合阿里云OSS对象存储

文章目录 1、OSS介绍及开通1.1、阿里云OSS简介1.2、开通OSS 2、创建存储空间bucket及密钥获取2.1、创建存储空间2.2、获取密钥 3、OSS快速入门案例4、在springboot项目中整合4.1、将oss配置放到yml文件中4.2、创建Oss属性类&#xff0c;接收yml文件中的属性4.3、封装文件上传功…

Redis 主从复制和哨兵监控,实现Redis高可用配置

文章目录 一、概述二、主从复制模拟说明三、准备配置文件四、启动Redis实例五、主从复制配置5.1 命令方式启用和取消主从复制5.2 配置文件方式启用和取消主从复制5.3 测试主从复制5.4 有其主从复制的其他参数配置 六、Sentinel 配置6.1 Sentinel 的作用6.2 Sentinel 监控说明6.…

现货白银指标分析根本没用!?

在现货白银市场上&#xff0c;RSI、PAR、抛物线、动力指标MOM等的分析工具大行其道&#xff0c;受到不少投资者的欢迎&#xff0c;其实这些指标都是由于美国人威尔斯威尔德发明&#xff0c;但它后来有发表文章推翻了这些分析工具的好处&#xff0c;并推出了另一套崭新理论去取代…

虹科直播 | CDS网络与数据安全专题技术直播重磅来袭,11.2起与您精彩相约

文章来源&#xff1a;虹科网络安全 阅读原文&#xff1a;https://mp.weixin.qq.com/s/T-CgU28hmYy4YV5SV9QGhg 虹科数据加密解决方案 虹科终端安全防护方案 虹科是在各细分专业技术领域内的资源整合及技术服务落地供应商&#xff0c;虹科网络安全事业部的宗旨是&#xff1a;让…

【牛牛送书 | 第二期】《ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践》

目录 前言&#xff1a; 本书目录&#xff1a; 内容简介&#xff1a; 专家评价&#xff1a; 适合对象&#xff1a; 送书规则&#xff1a; 前言&#xff1a; 现如今&#xff0c;随着计算机技术的不断发展和互联网的普及&#xff0c;我们已经迈入了一个高效的信息处理和传…

批量管理文件,轻松实现翻译与重命名,一键操作高效便捷!

在工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;而文件的翻译和重命名是常见的需求。为了帮助您更高效地管理文件&#xff0c;我们特别推出一款全新的批量文件管理工具&#xff0c;让您轻松实现文件的翻译和重命名&#xff0c;提高工作效率&#xff01; 首先第一步…

【收藏】药物专利信息查询方法-经典实操案例!

生物医药领域在专利行业中&#xff0c;一直是独特的存在。药物专利在各国之间有不同的登记要求&#xff0c;如何在这种查询方式诸多局限的情况下&#xff0c;检索得更全更准呢&#xff1f; 作为一名医药行业的IPR&#xff0c;经常需要调研药物原研专利。 大家所熟知的最快捷的…