第45期:一条 SQL 语句优化的基本思路

news2024/9/28 23:36:23

SQL 语句优化是一个既熟悉又陌生的话题。面对千奇百怪的 SQL 语句,虽然数据库本身对 SQL 语句的优化一直在持续改进、提升,但是我们不能完全依赖数据库,应该在给到数据库之前就替它做好各种准备工作,这样才能让数据库来有精力做它自己擅长的事情。

就拿 MySQL 来讲,一条 SQL 语句从客户端发出到数据库端返回结果一般会经历几个阶段:词法解析、语法解析、语义解析、逻辑优化、物理优化、最终执行并返回结果。那么这几个阶段,我们 DBA 能参与的也就是两个阶段:逻辑优化以及少许物理优化。所以在我们 DBA 这侧,对 SQL 语句的优化简单来讲就是让我们自己写的 SQL 语句能更好的适应数据库内置的优化规则,进一步让 SQL 语句在每个处理阶段能扫描更少的记录数量、字段数量来改善查询效果。

逻辑优化可以理解为基于N多数据库内置规则的预处理,规则定义越全面,对 SQL 语句优化的就越极致。比如使用表关联代替子查询、分组聚合条件上推、在特定条件下用内连接来替换外连接、视图上推到基表等等一系列优化措施。

物理优化可以理解为数据库按照当前 SQL 语句涉及到的表统计信息、列统计信息、索引个数、索引优劣、当前运行负载、当前硬件资源等可变因素来决定如何生成最优执行路径的方法。

一般来讲,我们拿到一条“不是很优化”、“烂的”、“慢的” 等 SQL 语句(至于怎么拿到这条语句,不在本篇讨论范围),应该按照以下几个步骤来逐步分析:
一、定位该SQL 语句涉及到的表结构,确认是磁盘表还是视图,如果是磁盘表,那么该考虑以下几点:
  1. 这些表是否统一为InnoDB引擎(MySQL 5.7 以及以前一些老旧版本可能会有非InnoDB引擎表),如果不是,转换表引擎为InnoDB。因为MySQL从5.5 版本开始,所有针对存储层的优化都是针对InnoDB引擎的。
  2. 极个别表为临时表。查看临时表相关参数是否设置合理;或者说能否把临时表替换为磁盘表。
  3. 查询每张表的字段类型,看有无不合理的部分。
  4. 查询每张表的记录数,检查是否过大需要后续拆分。
  5. 查询每张表的统计信息,检查是否及时做了更新。
  6. 针对这些表结构做进一步分析,查看索引设计是否合理?大致会有以下几种结果:

(1). 都没有索引,有的连主键都没有。

(2). 都有主键或者唯一索引,但是没有二级索引。

(3). 有主键或者唯一索引,也有一些二级索引,并且二级索引可选择性也比较优化。

(4). 有主键或者唯一索引,也有一些二级索引,但是这些二级索引可选择性很差。

二、如果有些表是视图,需要考虑以下几点:
  1. 该视图内部的算法有两种,一种是临时表(TEMPTABLE)、另外一种是合并(MERGE )。可以针对这两种算法来分别测试视图整体性能哪个较优化。
  2. 该视图内部如果有很复杂的处理逻辑,想办法把这部分内容简化或者从数据库剥离转交给应用处理,避免数据库将其劣势放大。
  3. 该视图如果非必须,可拆解为基表与上层SQL 语句做合并处理,这样效率较之前更优化(比如视图内部多表关联与上层基表再次关联,拆分后,优化器就会有更多更优的表关联顺序)。
三、到了这一步,如果是多张表关联,此处检查表关联键:
  1. 表关联键为主键和外键,也即两表用来关联的字段在一张表唯一并且在另一张表被引用,这时需要补充额外的过滤条件来减少扫描记录数。
  2. 表关联键为非主键,也即两表用来关联的字段都不唯一, 需要优化为唯一键值关联。
  3. 表关联键字段编码不一致,需要人为转换字段编码并改为一致。
四、基于以上几点,表结构分析这块已经大致完毕。接下来从SQL 语句层面来分析,比如这条SQL语句能否修改为更加优化的方式。可以考虑以下两点:
  1. SQL语句本身很简单,没有必要做修改。

    比如这条语句本身是20张表的内联查询,那它不够优化并不是因为写的不好,而是表关联个数实在太多。

  2. SQL语句本身很复杂,仔细分析后,可以简化这条语句的写法。

    复杂SQL语句又可以分为很多类别,比如多张子表关联、多张表嵌套子查询、多个子查询合并输出、多个聚合类操作等等。每种都有不同的优化方法,后续我会一一介绍。

五、那么前面几点做完后,进一步分析优化后SQL 语句的执行计划(如果有条件模拟生产环境压力模型),一般考虑如下几点:
  1. 改写后的语句执行计划很优化,走最合适的索引、语句本身也改的很简洁,那么这条语句改写完成。
  2. 改写后的语句执行计划没有走合适的索引,可以考虑在表上建立合适的索引。如果建新索引后,这条语句执行效果很好,那么改写完成。
  3. 改写后的语句走了合适的索引,执行效果依然不理想,这时可能有以下几种原因:

(1). 这条语句走的索引在不同过滤条件下,运行效果忽好忽坏。

比如日期字段,过滤条件为昨天的查询记录数为100条,过滤条件为前天的查询记录数则变为1W条。

(2). 这条语句走的索引较优,但是表记录数实在太大,走索引过滤的记录数也很多,需要从表结构这层做些优化。比如前面几期讲过的分区表、拆分表等方法;或者是从业务层面限制这条语句来扫描更少的记录数等等。

经过以上几个步骤,一般的语句基本上都能达到比较优化的结果。后续我将逐步介绍各种优化方法以及在MySQL里如何付诸于实践。


关于 MySQL 的技术内容,你们还有什么想知道的吗?赶紧留言告诉小编吧!

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

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

相关文章

FreeMarker生成word文档,固定word模板

该方法也就是通过freemarker生成固定的word文档,动态的word模板布局不能用该方法。 也就是必须有一个固定的模板文档是.ftl类型 如果初始文件为 需要手动改为: 也就是所有需要替换的地方,都需要有${XX}替换。 主要步骤为: 将 w…

JVM学习8: 字符串

基本特性 代表不可变字符序列final不可被继承实现了Serializable、Comparable等接口jdk8及以前使用final char[]存储,jdk9开始改为使用byte[]存储通过字面量方式给一个字符串变量赋值,此时字符串对象在字符串常量池里面 字符串常量池 字符串常量池不会…

《论文阅读》PAL: Persona-Augmented Emotional Support Conversation Generation

《论文阅读》PAL: Persona-Augmented Emotional Support Conversation Generation 前言简介思路出发点相关知识coefficient of determination任务定义模型框架实验结果前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失望?…

企企通:企业供应商风险管理,如何用采购管理软件赋能?

企业采购过程中,最怕/最担心的事情无非是:供应链异常。供应链异常,也就是我们常说的供应链风险,可以简单分为需求风险、供应商风险、物流风险和财务风险四大类。其中,最为突出的风险便是供应商风险。从寻找合适的供应商…

用VSCode搭建Vue.js开发环境及Vue.js第一个应用

目录 一、VSCode安装 二、VSCode简单配置 三、Vue.js的下载和引入 四、Vue.js第一个应用 一、VSCode安装 Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在您的桌面上运行,可用于Windows,macOS和Linux。它内置了对JavaScrip…

阿里一P7员工为证明自己年入百万,晒出工资,却被网友...

阿里的工资在行业内确实是比较高的一类,之前网络上流传着阿里P7年入百万的消息也不是空穴来风,日前,有位阿里P7员工,为了证明自己的确年入百万,晒出了他的工资,网友们看完都沸腾了。什么情况?一…

BSN全球伙伴大会于本周五召开在即,重磅嘉宾演讲主题前瞻

“第三届区块链服务网络(BSN)全球合作伙伴大会”召开在即,将于2023年2月17日(本周五)在杭州市拱墅区举办。 BSN已邀请到来自国内外的行业专家学者与生态合作伙伴,与各界来宾就“建设数字中国”指导思想中的…

iOS 客户端 IM 消息卡片插件化

背景 目前探探 IM 聊天消息列表由于长年累月的代码堆积,对业务迭代产生了很多的困扰。所以趁着工作中的一些空隙,对聊天页消息卡片做了插件化,使得不同的消息类型,可以根据具体需求方便的增删迭代。下面分享一下自己重构过程中一…

项目经理,千万不要在这时候跳槽

早上好,我是老原。节后开工也一段时间了,有不少小友私信老原想要面试题库,大多都是想要跳槽涨薪的......当然除了在做准备的,也有不少朋友都在诉苦:其实,不少人回头去看自己过去经验感觉就像个打杂的&#…

PCB中的HDI板生产中的变化

关键词:HDI概述 HDI发展演变 HDI生产难点如果把一整个电子产业比作浩瀚的宇宙,那些智能电子设备就像宇宙中闪耀的星光,当你以“上帝”的视角手持放大镜去观察时,这些闪烁的星光点点其实都是一个个由精密的“自然规律”所“设计”好…

金三银四丨黑蛋老师带你剖析-CTF岗

作者丨黑蛋二进制是个庞大的方向,对应着许许多多方向的岗位,除了之前说过的逆向岗位,漏洞岗位,病毒岗位,还有专门打CTF的岗位,CTF是网络安全领域的一种比赛。普遍来讲,大学生学习网络安全都会参…

percona软件介绍 、 innobackupex备份与恢复

1. 常用的mysql备份工具 物理备份缺点: 跨平台差。备份时间长、冗余备份、浪费存储空间。 解释如下:如Linux操作系统和Windows操作系统之间,由于文件系统不一样,如Linux操作系统的文件系统是ext4、xfs,Windows操作系统…

K8s+SpringBoot+gRpc

本文使用K8s当做服务注册与发现、配置管理&#xff0c;使用gRpc用做服务间的远程通讯一、先准备K8s我在本地有个K8s单机二、准备service-providerpom<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.…

浅谈性能测试监控系统,做好关键指标的监控

随着业务的增长&#xff0c;服务器部署由单一架构向分布式集群架构转变&#xff0c;性能测试过程中指标监控也由单一服务器向集群服务器转变。 对于性能测试团队来说&#xff0c;需要建立起适用于测试的多机监控系统&#xff0c;以便后期顺利且高效地进行监控分析调优&#xf…

Java程序员拿下高薪offer需要具备哪些能力?这份Java面试专题汇总助你拿下心仪offer!!

背景今天这篇文章的灵感来自一个粉丝的亲身经历&#xff0c;想必也是求职浪潮中很多朋友的经历&#xff0c;内卷大环境找不到满意工作的人太多了&#xff0c;之前也有很多人问过我怎么才能找到不错的工作&#xff0c;甚至是进大厂&#xff0c;所以今天就借这位粉丝的经历来聊聊…

对JAVA 中“指针“理解

对于Java中的指针&#xff0c;以下典型案例会让你对指针的理解更加深刻。 首先对于&#xff1a; 系统自动分配对应空间储存数字 1&#xff0c;这个空间被变量名称b所指向即: b ——> 1 变量名称 空间 明…

linux下yum安装consul实现动态配置管理

一、yum安装consul #安装yum-utils yum install -y yum-utils#配置consul的下载仓库 yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo#必须上面步骤&#xff0c;不然会找不到仓库 yum -y install consul#查看版本 consul -v 二、启动…

基于深度学习的三维重建(二):pytorch的简单操作及DataLoader、Dataset类简介

目录 1.numpy举几个demo 2.pytorch基础 2.1 tensor介绍 3.简单版DataSet & DataLoader 4.模型构建 5.深度学习模型demo&#xff1a;手写文字识别 5.1 构建网络 5.2 前向传播过程 5.3 训练部分 5.4 测试部分 5.5 模型导出 5.6 模型测试 6.pytorch可视化工具ten…

MySQL数据库调优————索引数据结构

B-TREE B-TREE数据结构 B-TREE特性 根节点的子结点个数2 < X < m&#xff0c;m是树的阶 假设m 3&#xff0c;则根节点可有2-3个孩子 中间节点的子节点个数m/2 < y < m 假设m 3&#xff0c;中间节点至少有2个孩子&#xff0c;最多3个孩子 每个中间节点包含n个关…

《MySql学习》 行锁对业务的影响

一. 行锁介绍 行锁由各个存储引擎分别实现&#xff0c;MyISAM存储引擎是不支持行锁的&#xff0c;这也是MySQL使用InnoDB作为默认存储引擎的一个重要原因&#xff0c;锁更细的InnoDB能支持更多的并发业务。但需要注意的是&#xff0c;行锁在InnoDB的实现是给索引加的锁&#x…