SQL调优讨论

说明:狭义的SQL调优,指对慢SQL(一般是Select语句,或包含Select的语句)优化,在不改变查询结果的情况下提高SQL执行效率。广义上的SQL调优,指对某个慢查询优化,通过一些类操作提供查询效率,不至于接口超时。

本文讨论广义上SQL调优的几个方面;

SQL语句

查询的核心是SQL,一个查询可能包含了一个或者多个SQL。SQL调优的第一步,是将慢查询执行的SQL取出来,这个SQL可能是运维同事通过监控捕捉到的,反馈给了开发。也有可能是通过慢SQL日志发现的,MySQL设置慢SQL日志可参考下面这篇文章:

  • 如何开启MySQL的慢查询日志

拿到SQL后,如果是MySQL,可通过explain查看这个语句的执行计划;

# explain查看执行计划
explain select * from user;

其中type列,表示了此次查询的类型,如下:

在这里插入图片描述

效率排序如下

system > const > eq_ref > ref > range > index > all

阿里巴巴代码规范,要求如下:

在这里插入图片描述

以上是SQL语句方面

数据库设计

索引失效

发现了慢SQL,查看执行计划后,发现执行效率低,就要着手来优化。需要分析以下几点:

  • 关联查询,关联的字段,是否建立了索引?类型是否一致?不一致会造成隐式的类型转换,导致索引失效;

  • 查询是否使用了or、like、内置函数,导致了索引失效?

  • 索引是否遵循了最左匹配原则,即联合索引,查询条件(并非书写顺序,参考文章)是否与索引顺序一致?

  • 查询的字段是否加了索引,是否造成了回表?即查询的字段没有索引,使其借助了主键索引

建立索引

在表设计建立索引时,除了需考虑以上情况,还需考虑:

  • 查询频繁使用的字段,where、order by 、join的字段建立索引;

  • 组合索引,应该把散列度高的值放在前面;

  • 过长的字段(加密的摘要字段),使用前缀索引;

  • 区分度低(性别)的字段,不建议创建索引;

  • 频繁更新的字段,不建议创建索引;

  • 不建议用无序的值(身份证号、UUID)作为索引;

建立前缀索引,参考下面这篇文章:

  • 怎么给数据库某个字段建立一个前缀索引

除此之外,在做表设计的时候,还应该考虑到查询便利和兼容性。博主在工作中遇到了一个场景,项目原来使用的是postgres数据库,后来客户需要能支持MySQL,遂将项目中的SQL改造成MySQL,改造过程中发现有许多查询与postgres数据库的数据类型高度绑定,脱离了postgres数据库,只能用复杂的,勉强能执行的MySQL语句实现,其查询效率可想而知。

举一个例子,做RBAC(基于角色的权限验证框架,参考:搭建一个基于角色的权限验证框架)设计的几张表,用户表拥有多个角色,角色拥有多个权限,可以设计以下五张表:

  • 用户表;

  • 角色表;

  • 权限表;

  • 用户角色表;

  • 角色权限表;

但在项目中只建了前三张表,用户对应的角色,角色对应的权限,都作为前者的一个字段存储了。因为postgres有字符串数组这个类型,也有相关的函数支持,所以很方便,但MySQL没有这样的类型,改造的时候就很麻烦,写复杂了查询效率低,不写复杂又达不到业务需求。

分区

另外,如果某张表数据量非常大,有千万级的记录,需考虑建立分区提高查询效率。分区表,可通过对某字段的值或范围划分数据,后续查询,加上分区字段,相当于自带了一个索引。MySQL建立分区表,可参考下面两篇文章:

  • MySQL分区表(一)

  • MySQL分区表(二)

代码层面

缓存

如果SQL效率确实低,数据库表能加的索引也加了,还没效率。考虑是不是能从代码层面入手,看能不能加缓存,把一些基本不变的数据(如账户信息)在登录时或项目启动时,加载到缓存里。可参考下面这篇文章:

  • Redis缓存预热

既然加了缓存,也就需要考虑维护,在修改、删除的地方,需要同步删除缓存,查询的时候再加入到缓存。而缓存Key的命名也需要规范,可参考如下:

  • 如果存储的是数据库中查询到的数据:数据库名称:表名:主键名:主键值,如
db_user:i_user:id:1 {"":"","":""}
  • 如果存储的是临时性的业务数据:模块名称:业务名称:唯一标识,如:
SSO:USERLOGIN:UUID 123456

拆开SQL

还可以考虑是否能将SQL拆开,拆成几个小SQL,避免写一个大而全的SQL。博主之前遇到一个大项目,有个查询的权限控制竟然是把符合条件记录都查出来,再根据返回数据的某个字段,和当前账户的ID比较,在代码里去剔除掉,而不是在SQL里做条件控制。

我以为是某个弱智程序员写出来的,后面发现是我经验不足,这样反而比把条件加在SQL里查询效率高。小丑竟是我自己。

硬件方面

最后是硬件方面,需要考虑数据库部署的结构(是否有集群、有没有读写分离)和硬件性能(CPU、内存)。

读写分离,是指将对数据库的读操作和写操作分开,分散数据库压力。除了数据库结构上要部署,代码也需要支持,可参考下面这几篇文章:

  • MySQL主从结构搭建

  • MySQL主从的应用

  • 使用Canal实现MySQL主从同步

硬件性能就不用说了,部署数据库的服务器最好是一台服务器,即便是部署主从,也应该是主节点一台服务器,从节点一台服务器,不要和其他服务混在一起,硬件配置可根据自己的业务需要配置,越高越高,当然也需要考虑经济效益。

总结

本文从SQL语句、数据库设计、代码和硬件方面讨论了SQL调优,一家之言,希望能对大家有启发

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

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

相关文章

Django基础之ORM

一.前言 上一节简单的讲了一下orm,主要还是做个了解,这一节将和大家介绍更加细致的orm,以及他们的用法,到最后再和大家说一下cookie和session,就结束了全部的django基础部分 二.orm的基本操作 1.settings.py&#x…

PageView组件的功能和用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了如何屏蔽事件关的内容,本章回中将介绍PageView Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的PageView是指左右滑动或者上下滑动显示不同的页面,Flutter把它…

Flutter:自定义Tab切换,订单列表页tab,tab吸顶

1、自定义tab切换 view <Widget>[// 好评<Widget>[TDImage(assetUrl: assets/img/order4.png,width: 36.w,height: 36.w,),SizedBox(width: 10.w,),TextWidget.body(好评,size: 24.sp,color: controller.tabIndex 0 ? AppTheme.colorfff : AppTheme.color999,),]…

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(一)

Understanding Diffusion Models: A Unified Perspective&#xff08;一&#xff09; 文章概括引言&#xff1a;生成模型背景&#xff1a;ELBO、VAE 和分层 VAE证据下界&#xff08;Evidence Lower Bound&#xff09;变分自编码器 &#xff08;Variational Autoencoders&#x…

QT6 + CMAKE编译OPENCV3.9

参考文档 [1] https://blog.csdn.net/rjkf_css/article/details/135676077 前提条件 配置好相关运行环境&#xff1a;QT6、OPENCV3.9的sources文件 OPENCV下载网页&#xff1a;https://opencv.org/releases/ QT6下载教程&#xff1a;https://blog.csdn.net/caoshangpa/article…

Zemax 非序列模式下的颜色检测器和颜色混合

在 Zemax 的非序列模式中&#xff0c;探测器用于捕获系统中射线的信息。可以使用各种类型的探测器来捕获光学系统性能的不同方面&#xff0c;例如矩形探测器&#xff0c;它存储撞击它的 NSC 源射线的能量数据。 另一种经常使用的探测器类型是 Detector Color&#xff0c;它是一…

金融级分布式数据库如何优化?PawSQL发布OceanBase专项调优指南

前言 OceanBase数据库作为国产自主可控的分布式数据库&#xff0c;在金融、电商、政务等领域得到广泛应用&#xff0c;优化OceanBase数据库的查询性能变得愈发重要。PawSQL为OceanBase数据库提供了全方位的SQL性能优化支持&#xff0c;助力用户充分发挥OceanBase数据库的性能潜…

uni-app 程序打包 Android apk、安卓夜神模拟器调试运行

1、打包思路 云端打包方案&#xff08;每天免费次数限制5&#xff0c;最简单&#xff0c;可以先打包尝试一下你的程序打包后是否能用&#xff09;&#xff1a; HBuilderX 发行App-Android云打包 选择Android、使用云端证书、快速安心打包本地打包&#xff1a; HBuilderX …

小利特惠源码/生活缴费/电话费/油卡燃气/等充值业务类源码附带承兑系统

全新首发小利特惠/生活缴费/电话费/油卡燃气/等充值业务类源码附带U商承兑系统 安装教程如下 图片:

MacOS安装Docker battery-historian

文章目录 需求安装battery-historian实测配置国内源相关文章 需求 分析Android电池耗电情况、唤醒、doze状态等都要用battery-historian&#xff0c; 在 MacOS 上安装 battery-historian&#xff0c;可以使用 Docker 进行安装runcare/battery-historian:latest。装完不需要做任…

二叉树(了解)c++

二叉树是一种特殊的树型结构&#xff0c;它的特点是: 每个结点至多只有2棵子树(即二叉树中不存在度大于2的结点) 并且二叉树的子树有左右之分&#xff0c;其次序不能任意颠倒&#xff0c;因此是一颗有序树 以A结点为例&#xff0c;左边的B是它的左孩子&#xff0c;右边的C是…

亚博microros小车-原生ubuntu支持系列:7-脸部检测

背景知识 官网介绍&#xff1a; Face Mesh - mediapipe mpFaceMesh.FaceMesh() 类的参数有&#xff1a;self.staticMode, self.maxFaces, self.minDetectionCon, self.minTrackCon staticMode:是否将每帧图像作为静态图像处理。如果为 True&#xff0c;每帧都会进行人脸检测…

想品客老师的第六天:函数

函数基础的部分写在这里 函数声明 在js里万物皆对象&#xff0c;函数也可以用对象的方式定义 let func new Function("title", "console.log(title)");func(我是参数title); 也可以对函数赋值&#xff1a; let cms function (title) {console.log(tit…

leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先

&#xff08;一&#xff09;问题描述 236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09;236. 二叉树的最近公共祖先 - 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科 [https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B…

Spring Boot整合JavaMail实现邮件发送

一. 发送邮件原理 发件人【设置授权码】 - SMTP协议【Simple Mail TransferProtocol - 是一种提供可靠且有效的电子邮件传输的协议】 - 收件人 二. 获取授权码 开通POP3/SMTP&#xff0c;获取授权码 授权码是QQ邮箱推出的&#xff0c;用于登录第三方客户端的专用密码。适用…

AIGC数智化赋能:创新地方文旅内容生产传播模式

随着人工智能技术的迅猛发展&#xff0c;AI的应用领域日益扩大。当前&#xff0c;如何将AI这一新质生产力转化为新质传播力和影响力&#xff0c;进而为城市文化和旅游产业的内容创造、传播及消费模式带来全面革新&#xff0c;已成为数字化文旅发展的关键议题。 AI宣传——提升…

Tensor 基本操作4 理解 indexing,加减乘除和 broadcasting 运算 | PyTorch 深度学习实战

前一篇文章&#xff0c;Tensor 基本操作3 理解 shape, stride, storage, view&#xff0c;is_contiguous 和 reshape 操作 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started Tensor 基本使用 索引 indexing示例代码 加减…

STM32 硬件I2C读写

单片机学习&#xff01; 目录 前言 一、步骤 二、配置I2C外设 2.1 开启I2C外设和GPIO口时钟 2.2 GPIO口初始化为复用开漏模式 2.3 结构体配置I2C 2.4 使能I2C 2.5 配置I2C外设总代码 三、指定地址写时序 3.1 生产起始条件S 3.2 监测EV5事件 3.3 发送从机地址 3.4 …

使用 Elasticsearch 导航检索增强生成图表

作者&#xff1a;来自 Elastic Louis Jourdain 及 Ivan Monnier 了解如何使用知识图谱来增强 RAG 结果&#xff0c;同时在 Elasticsearch 中高效存储图谱。本指南探讨了根据用户查询动态生成知识子图的详细策略。 检索增强生成 (RAG) 通过将大型语言模型 (LLM) 的输出基于事实数…

【后端开发】字节跳动青训营之性能分析工具pprof

性能分析工具pprof 一、测试程序介绍二、pprof工具安装与使用2.1 pprof工具安装2.2 pprof工具使用 资料链接&#xff1a; 项目代码链接实验指南pprof使用指南 一、测试程序介绍 package mainimport ("log""net/http"_ "net/http/pprof" // 自…