MySQL优化之SQL调优策略

 首先以一张思维导图从全局上给大家分享以下几种SQL优化策略,再详细讲解

1、避免使用SELECT *

        在阿里的编码规范中也强制了数据库查询不能使用SELECT *,因为SELECT *方式走的都是全表扫描,导致的结果就是查询效率非常低下,其原因为当我们使用SELECT *方式时,SQL会有一个格式化的阶段,这个阶段会将所有表字段都取出(将*号解析成表的各个字段),增加了查询解析器的成本

2、小表驱动大表

        小表驱动大表指的是使用数据量较小,索引比较完备的表,然后使用它的索引和条件对大表的数据进行关联和筛选,从而减少数据的计算量,提升查询效率

        例如当下我又两张表,分别为学生表(有45条数据),分数表(有1000条数据),它们需要进行关联查询,我们可能会用到LEFT JOIN或者RIGHT JOIN ,在FROM我们跟的表一般为主表,此时如果我们的SQL语句为

        “……FROM student LEFT JOIN score……”

 就叫做小表驱动大表;反之就是大表驱动小表,因为它需要将分数表中的1000条数据都查出来之后在去一一关联学生表

3、用连接查询代替子查询

        在MySQL进行两张或两张以上的表进行联查时,可以使用连接查询和嵌套查询,尽可能减少嵌套查询的次数,其原因为:

        ①嵌套查询需要执行两次数据库查询,一次是外部查询,一次是嵌套子查询,而是用连接查询可以减少数据库查询次数从而提升查询效率

        ②连接查询可以更好地用上数据库的索引,而嵌套查询通常需要扫描整个表,因此连接查询可以跟快的执行查询操作

        当然以上说法也并不绝对,在嵌套查询中我们依旧可以通过合理的使用IN或EXIST关键字来提升查询效率(遵循小表驱动大表原则)。

       IN关键字通常应用在嵌套查询的嵌套条件前,例如“……FROM xxx WHERE xxx IN(嵌套SQL)”

        如果sql语句中包含了IN关键字,则它会优先执行IN里面的子查询语句,然后再执行IN外面的语句。如果IN里面的数据量很少,作为条件查询速度更快。

        EXISTS关键字也使用在嵌套查询条件前,例如

                “……FROM xxx WHERE EXISTS (嵌套SQL语句)”

        如果sql语句中包含了exists关键字,它优先执行exists左边的语句(即主查询语句)。然后把它作为条件,去跟右边的语句匹配。如果左侧SQL语句查询数据量较少,依旧能够提升查询效率。

4、提升GROUP BY的查询效率

        如果没有为GROUP BY的字段设置索引,则查询可能会变得非常慢(这里面涉及到了一个B+树的概念,它会为我们有序的排序索引的数据),当为需要分组的字段建立索引后,数据就是有序的,这些有序的数据会排列在一起

5、使用批量插入

        MySQL本身就支持批量插入数据,例如:

        而在代码中通过持久层访问数据库插入数据时,我们也不建议一条一条或者通过循环的形式插入,因为每次调用循环里的插入方法 相当于都要和数据库进行一次;宜采取的方式是将数据封装在一个集合中,通过集合一次性插入数据,例如:

 6、当一次查询数据量过多时,一定要使用LIMIT进行分页

        一个查询返回成干上万的数据行,不仅占用了大量的系统资源,也会占用更多的网络带宽,影响查询效率也有可能造成内存溢出。使用LIMIT可以限制返回的数据行数,减轻了系统负担,提高了查询效率。使用LIMIT可以达到以下结果:

  • 避免过度提取数据:对于大型数据库系统,从数据库中提取大量的数据可能会导致系统崩溃。使用LIMIT可以限制提取的数据量,避免过度提取数据,保护系统不受影响。
  • 优化分页查询:分页查询需要查询所有的数据才能进行分页处理,这会浪费大量的系统资源和时间。使用LIMIT优化分页查询可以只章询需要的数据行,缩短查询时间,减少资源的浪费。
  • 简化查询结果:有时我们只需要一小部分数据来得出决策,而不是整个数据集。使用LIMIT可以使结果集更加精简和易于阅读和理解。
  • 限制行数非常有用,因为它可以提高查询性能、减少处理需要的时间,并且只返回我们关心的列

7、需要合并数据时尽可能使用UNION ALL而非UNION

         UNION ALL和UNION通常在数据合并中使用,例如:

        “(SELECT * FROM user WHERE id=1) UNION (SELECT * FROM user WHERE id=2)”
         SQL语句使用UNION关键字后,可以获取去重后的数据,而如果使用UNION ALL关键字,可以获取所有数据,包含重复的数据。在业务允许出现重复数据的情况下,我们更推荐使用UNION ALL,因为UNION去重需要经过数据的遍历、排序和比较,计算无疑是更耗费性能和CPU资源的。

        除非是有些特殊的场景,比如UNION ALL之后,结果集中出现了重复数据,而业务场景中是不允许产生重复数据的,这时可以使用UNION;或者在UNION前利用索引提升查询效率

8、尽可能减少表关联的次数(减少JOIN的使用)

        对于这个优化策略,我的理解是,减少JOIN的次数并非减少必要使用次数,JOIN终究在查询效率上还是远高于IN的,这个减少的含义应该是减少表的冗余关联字段来减少表的链接(即需要找到多表能够进行关联的最少字段,用最少的字段进行关联)。

        减少JOIN的使用次数更多的原因还是在SQL语句的编写上,很容易造成关联错误。

        以上就是关于SQL调优的策略介绍,总结来说,SQL调优的原则就是减少数据扫描、减少与数据库反复的交互次数、减少内存开销,而大部分的优化策略都是在索引的基础上是实现的。

———————————————————————————————————————————

路漫漫其修远兮,吾将上下而求索~
到此关于SQL调优策略的讲解算告一段落了,写作不易,如果你认为博主写的不错!

请点赞、关注、评论给博主一个鼓励吧,您的鼓励就是博主前进的动力。

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

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

相关文章

苹果笔记本 macbook 在 office word 中使用 mathtype 的方法

前言 想在 MacBook 中使用 mathtype,去搜索,去 Apple Store 下载也发现没有 解决方法 打开 office Word 的「插入」中的「获取加载项」、「我的加载项」。 在应用商店中下载,需要登录自己的微软账号。 加载成功后就可以使用了。 注意 和…

【Unity实战100例】Unity对Ini格式的配置文件管理和读写

目录 一.编写ini格式配置文件 二.读取解析ini文件 三.调用属性 INI 文件以文本形式存储,易于阅读和编辑。这种人可读的格式使得调整配置参数变得更加直观,不需要专门的工具。 INI 文件是一种轻量级的配置文件格式,不需要复杂的解析器或库。它的结构相对简单,适用于小到

What is `addFormattersdoes` in `WebMvcConfigurer` ?

addFormatters 方法在SpringMVC框架中主要用于向Spring容器注册自定义的格式化器(Formatter) SpringMVC内置了一系列的标准格式化器,用于处理日期、数字和其他常见类型的转换。 开发者也可以通过实现 WebMvcConfigurer 接口,并重写…

Unix时间戳

时间戳,相信很多相关专业的人,计算机软件电子等等都会听过。由于最早是由Unix系统使用所以又叫Unix时间戳。 Unix 时间戳(Unix Timestamp)定义为从UTC(世界协调时)/GMT(格林尼治时)…

内网穿透的应用-使用Docker搭建一个Wiki.Js知识库系统并实现分享他人远程创作

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上,我们都需要通过某种方式来有条理的组织相应的知识架构,那么一个好的知识整…

KNN算法原理及应用

理解KNN 算法原理 KNN是监督学习分类算法,主要解决现实生活中分类问题。 根据目标的不同将监督学习任务分为了分类学习及回归预测问题。 监督学习任务的基本流程和架构: (1)首先准备数据,可以是视频、音频、文本、…

【C++】STL 算法 - 累加填充算法 ( 元素累加算法 - accumulate 函数 | 元素填充算法 - fill 函数 )

文章目录 一、元素累加算法 - accumulate 函数1、函数原型分析2、代码示例 二、元素填充算法 - fill 函数1、函数原型分析2、代码示例 一、元素累加算法 - accumulate 函数 1、函数原型分析 在 C 语言 的 标准模板库 ( STL , STL Standard Template Library ) 中 , 提供了 accu…

晶格动力学 GULP 软件的安装步骤

---------------------------------------------------------------------- GULP软件现已发展到5.2版本,其使用Fortran编译器,可运行在Linux/Unix系统下,但不提供任何Windows版本的技术支持。 下载网址: http://gulp.curtin.ed…

flink 最后一个窗口一直没有新数据,窗口不关闭问题

flink 最后一个窗口一直没有新数据&#xff0c;窗口不关闭问题 自定义实现 WatermarkStrategy接口 自定义实现 WatermarkStrategy接口 窗口类型&#xff1a;滚动窗口 代码&#xff1a; public static class WatermarkDemoFunction implements WatermarkStrategy<JSONObject…

10种较流行的网络安全框架及特点分析

网络安全框架主要包括安全控制框架&#xff08;SCF&#xff09;、安全管理框架&#xff08;SMP&#xff09;和安全治理框架&#xff08;SGF&#xff09;等类型。对于那些希望按照行业最佳实践来开展网络安全能力建设的企业来说&#xff0c;理解并实施强大的网络安全框架至关重要…

Demystifying CXL Memory with Genuine CXL-Ready Systems and Devices——论文阅读

MICRO 2023 Paper CXL论文阅读汇总 问题 对更大容量和更高带宽的内存的不断增长的需求推动了基于Compute eXpress Link&#xff08;CXL&#xff09;的内存扩展和分离技术的创新。特别是&#xff0c;基于CXL的内存扩展技术不仅能够经济地扩展内存容量和带宽&#xff0c;还能够…

【数据结构】二叉树(遍历,递归)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​ 目录 二叉树遍历规则 前序遍历 ​…

flutter 客户端日志上传定位错误信息

背景 flutter 开发的app 安装到真机上 无法定位报错信息&#xff0c;只能使用usb连接电脑 使用adb logcat来查看日志效率低下。 想法 如果将flutter 开发的app 运行的时候 将日志写进一个日志文件里面去&#xff0c;然后给flutter app搭建一个http服务器&#xff0c;后端知道对…

如何使用VNC实现Win系统远程桌面Ubuntu图形化界面【内网穿透】

文章目录 推荐前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 …

vue:处理base64格式文件pdf、图片预览

一、需求&#xff1a;后端返回是base64数据&#xff0c;需要前端处理来展示文件。 二、实现方法&#xff1a; 解释一下这段代码的功能&#xff1a; &#xff09;preview(item) 是一个函数&#xff0c;接受一个参数 item&#xff0c;其中包含了文件的相关信息。 &#xff09;首…

HTML5+CSS3+JS小实例:实时给中文添加拼音

实例:实时给中文添加拼音 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"&…

使用freessl为网站获取https证书及配置详细步骤

文章目录 一、进入freessl网站二、修改域名解析记录三、创建证书四、配置证书五、服务启动 一、进入freessl网站 首先进入freessl网站&#xff0c;需要注册一个账号 freessl网站 进入网站后填写自己的域名 接下来要求进行DCV配置 二、修改域名解析记录 到域名管理处编辑域名…

智慧水务管理的发展历史有哪些阶段呢

随着科技的飞速发展&#xff0c;智慧水务管理已经成为了城市基础设施的重要组成部分。从传统的人工管理到现代的智能化管理&#xff0c;智慧水务经历了多个阶段的发展历程。本文将带您了解智慧水务管理的历史演变。 一、初级阶段&#xff1a;人工管理 在智慧水务管理发展的初期…

MS2358——96KHz、24bit 音频 ADC

产品简述 MS2358 是带有采样速率 8kHz-96kHz 的立体声音频模数 转换器&#xff0c;适合于面向消费者的专业音频系统。 MS2358 通过使用增强型双位 Δ - ∑ 技术来实现其高精度 的特点。 MS2358 支持单端的模拟输入&#xff0c;所以不需要外部器 件&#xff0c;非常适…

maven环境搭建(打包项目)

Maven:直观来讲就是打包写好的代码封装 Apahche 软件基金会&#xff08;非营业的组织&#xff0c;把一些开源软件维护管理起来&#xff09; maven apahce的一个开宇拿项目&#xff0c;是一个优秀的项目构建&#xff08;管理工具&#xff09; maven 管理项目的jar 以及jar与j…