当前位置: 首页 > news >正文

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调优,一家之言,希望能对大家有启发

相关文章:

SQL调优讨论

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

【STM32】-TTP223B触摸开关

前言 本文章旨在记录博主STM32的学习经验,我自身也在不断的学习当中,如果文章有写的不对的地方,欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…...

华为数据之道-读书笔记

内容简介 关键字 数字化生产 已经成为普遍的商业模式,其本质是以数据为处理对象,以ICT平台为生产工具,以软件为载体,以服务为目的的生产过程。 信息与通信技术平台(Information and Communication Technology Platf…...

Zookeeper(28)Zookeeper的线性化写入和顺序一致性读是什么?

Zookeeper 是一个分布式协调服务,它在设计上提供了强一致性的保证,其中包括线性化写入和顺序一致性读。这两种一致性模型确保了在分布式系统中数据的一致性和操作的确定性。 线性化写入(Linearizable Writes) 线性化写入保证在任…...

Ubuntu安装GitLab

在 Ubuntu 上安装 GitLab 的步骤如下。这里以 GitLab Community Edition(CE)为例: 前提条件 确保你的 Ubuntu 系统是 20.04 或更高版本。确保你的系统满足 GitLab 的硬件要求。 步骤 更新系统包: sudo apt update sudo apt upg…...

Stable Diffusion 3.5 介绍

Stable Diffusion 3.5 是由 Stability AI 推出的最新一代图像生成模型,是 Stable Diffusion 系列的重要升级版本。以下是关于 Stable Diffusion 3.5 的详细信息: 版本概述 Stable Diffusion 3.5 包含三个主要版本: Stable Diffusion 3.5 L…...

力扣hot100-->滑动窗口、贪心

你好呀,欢迎来到 Dong雨 的技术小栈 🌱 在这里,我们一同探索代码的奥秘,感受技术的魅力 ✨。 👉 我的小世界:Dong雨 📌 分享我的学习旅程 🛠️ 提供贴心的实用工具 💡 记…...

### 2.5.3 二叉树的基本操作

2.5.3 二叉树的基本操作 // 获取树中节点的个数 int size(Node root);// 获取叶子节点的个数 int getLeafNodeCount(Node root);// 子问题思路-求叶子结点个数// 获取第K层节点的个数 int getKLevelNodeCount(Node root,int k);// 获取二叉树的高度 int getHeight(Node root);…...

GAEA 社区:从用户到共同创造者

GAEA 模型最引人注目的方面之一是,它将用户视为共同创造者,而不仅仅是被动的消费者。在许多中心化平台中,用户就是用户。但在 GAEA 的生态系统中,每个人都在推动进步。无论您是贡献计算能力、分享有价值的数据还是帮助改进模型&am…...

记录一个连不上docker中的mysql的问题

引言 使用的debian12,不同发行版可能有些许差异,连接使用的工具是navicat lite 本来是毫无思绪的,以前在云服务器上可能是防火墙的问题,但是这个桌面环境我压根没有使用防火墙。 直到 ying192:~$ mysql -h127.0.0.1 -uroot ERROR 1045 (28…...

doris:MySQL Load

Doris 兼容 MySQL 协议,可以使用 MySQL 标准的 LOAD DATA 语法导入本地文件。MySQL Load 是一种同步导入方式,执行导入后即返回导入结果。可以通过 LOAD DATA 语句的返回结果判断导入是否成功。一般来说,可以使用 MySQL Load 导入 10GB 以下的…...

使用vitepress搭建自己的博客项目

一、介绍can-vitepress-blog 什么是CAN BLOG CAN BLOG是基于vitepress二开的个人博客系统,他能够方便使用者快速构建自己的博客文章,无需繁琐的配置和复杂的代码编写。 CAN BLOG以antdv为UI设计基础,简洁大方,界面友好&#xf…...

Yii框架中的扩展:如何使用外部库

在Yii框架中,扩展功能的一种常见且有效的方式是使用外部库。这些外部库可以帮助开发者实现特定的功能,如调用第三方API、处理图片、生成PDF文件或发送邮件等。以下是使用外部库扩展Yii框架的详细步骤: 一、安装外部库 使用Composer&#xff…...

【Elasticsearch】inference ingest pipeline

Elasticsearch 的 Ingest Pipeline 功能允许你在数据索引之前对其进行预处理。通过使用 Ingest Pipeline,你可以执行各种数据转换和富化操作,包括使用机器学习模型进行推理(inference)。这在处理词嵌入、情感分析、图像识别等场景…...

Linux的基本指令(上)

1.ls指令 语法:ls [选项] [目录或文件] 功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信息。 常用选项: -a 列出⽬录下的所有⽂件,包括以 . 开头的隐含⽂件。 -d 将…...

【贪心算法】洛谷P1106 - 删数问题

2025 - 01 - 22 - 第 46 篇 【洛谷】贪心算法题单 - 【贪心算法】 - 【学习笔记】 作者(Author): 郑龙浩 / 仟濹(CSND账号名) 目录 文章目录 目录P1106 删数问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路代码 P1106 删数问题 题目描述 键盘输入一个高…...

【人工智能】Python中的知识图谱构建与应用

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能技术的不断发展,知识图谱已成为信息检索、推荐系统、自然语言处理等领域的重要技术之一。本文将详细介绍如何使用Python构建知…...

Spring WebSocket 与 STOMP 协议结合实现私聊私信功能

目录 后端pom.xmlConfig配置类Controller类DTO 前端安装相关依赖websocketService.js接口javascripthtmlCSS 效果展示简单测试连接: 报错解决方法1、vue3 使用SockJS报错 ReferenceError: global is not defined 功能补充拓展1. 安全性和身份验证2. 异常处理3. 消息…...

【Matlab高端绘图SCI绘图模板】第05期 绘制高阶折线图

1.折线图简介 折线图是一个由点和线组成的统计图表,常用来表示数值随连续时间间隔或有序类别的变化。在折线图中,x 轴通常用作连续时间间隔或有序类别(比如阶段1,阶段2,阶段3)。y 轴用于量化的数据&#x…...

java后端之事务管理

Transactional注解:作用于业务层的方法、类、接口上,将当前方法交给spring进行事务管理,执行前开启事务,成功执行则提交事务,执行异常回滚事务 spring事务管理日志: 默认情况下,只有出现Runti…...

常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)

1.FFmpeg FFmpeg是一个非常强大的开源多媒体处理框架,它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架! 官方网址:https://ffmpeg.org/ FFmpeg 的主要特点和功能: 编解码器支持: FFmpe…...

如何移植ftp服务器到arm板子?

很多厂家提供的sdk,一般都不自带ftp服务器功能, 需要要发人员自己移植ftp服务器程序。 本文手把手教大家如何移植ftp server到arm板子。 环境 sdk:复旦微 Buildroot 2018.02.31. 解压 $ mkdir ~/vsftpd $ cp vsftpd-3.0.2.tar.gz ~/vs…...

牛批,吾爱出品

可能是因为从事IT的原因,我身边的大多数朋友也是从事相关工作的,而IT工作往往需要长时间对着电脑。这样就很容易眼睛疲劳。今天给大家推荐几款,希望有对有需要的小伙伴有所帮助,大家可以收藏以来哦。 CareUEyes CareUEyes是一款绿…...

基于 Android 的日程管理系统的设计与实现

标题:基于 Android 的日程管理系统的设计与实现 内容:1.摘要 基于 Android 的日程管理系统旨在帮助用户更高效地管理个人日程安排。该系统采用了 Android 平台的优势,结合了简洁的界面设计和强大的功能,为用户提供了便捷的日程管理体验。 在设计与实现过…...

Kubectl 与 Helm 详解

在 Kubernetes 生态中,kubectl 和 Helm 是两个核心工具,分别用于直接管理 Kubernetes 资源和简化应用的部署与管理。本文将深入探讨 kubectl 和 Helm 的功能、使用场景、部署与更新方式,并对比它们的优缺点。 1. Kubectl 详解 1.1 什么是 Kubectl? kubectl 是 Kubernetes…...

centos搭建docker registry镜像仓库

centos搭建docker registry镜像仓库 简介 Docker Registry是一个存储和分发Docker镜像的服务。它允许用户上传、下载和管理 Docker 镜像,为容器化应用的部署提供了便利。 拉取镜像 docker image pull registry证书配置 创建镜像仓库的镜像数据目录和证书目录&…...

Pyecharts之饼图与多饼图的应用

在数据可视化领域,饼图是一种常用的图表类型,特别适合展示数据的比例关系。Pyecharts 为我们提供了强大的饼图绘制功能,不仅可以轻松绘制各种饼图,还能对饼图的样式和数据标签进行深度定制,并且可以组合多个饼图以满足…...

51单片机入门_01_单片机(MCU)概述(使用STC89C52芯片;使用到的硬件及课程安排)

文章目录 1. 什么是单片机1.1 微型计算机的组成1.2 微型计算机的应用形态1.3 单板微型计算机1.4 单片机(MCU)1.4.1 单片机内部结构1.4.2 单片机应用系统的组成 1.5 80C51单片机系列1.5.1 STC公司的51单片机1.5.1 STC公司单片机的命名规则 2. 单片机的特点及应用领域2.1 单片机的…...

蓝桥杯LQ1044 求完数

题目描述 因子:因子也叫因数,例如3515,那么3和5是15的因子。 同时15115,那么1和15也是15的因子。 1,3,5,15 这四个因子是15的所有因子。 完数:如果一个数等于不含它本身的其他因子之…...

Django 日志配置实战指南

日志是 Django 项目中不可或缺的一部分,它帮助我们记录应用程序的运行状态、调试信息、错误信息等。通过合理配置日志,我们可以更好地监控和调试应用程序。本文将详细介绍如何在 Django 项目中实现日志文件分割、日志级别控制以及多环境日志配置,并结合最佳实践和代码示例,…...

[笔记] 极狐GitLab实例 : 手动备份步骤总结

官方备份文档 : 备份和恢复极狐GitLab 一. 要求 为了能够进行备份和恢复,请确保您系统已安装 Rsync。 如果您安装了极狐GitLab: 如果您使用 Omnibus 软件包,则无需额外操作。如果您使用源代码安装,您需要确定是否安装了 rsync。…...

php代码审计2 piwigo CMS in_array()函数漏洞

php代码审计2 piwigo CMS in_array()函数漏洞 一、目的 本次学习目的是了解in_array()函数和对项目piwigo中关于in_array()函数存在漏洞的一个审计并利用漏洞获得管理员帐号。 二、in_array函数学习 in_array() 函数搜索数组中是否存在指定的值。 in_array($search,$array…...

随机矩阵投影长度保持引理及其证明

原论文中的引理 2 \textbf{2} 2 1. \textbf{1. } 1. 引理 1 \textbf{1} 1(前提之一) 1.1. \textbf{1.1. } 1.1. 引理 1 \textbf{1} 1的内容 👉前提: X ∼ N ( 0 , σ ) X\sim{}N(0,\sigma) X∼N(0,σ)即 f ( x ) 1 2 π σ e – x 2 2 σ 2 f(x)\text{}…...

蓝桥杯真题 - 三国游戏 - 题解

题目链接:https://www.lanqiao.cn/problems/3518/learning/ 个人评价:难度 2 星(满星:5) 前置知识:贪心 整体思路 先假设魏蜀吴中的某一个势力最终获胜的情况下,如何求出事件发生的最大数量&a…...

Spring 源码学习(七)——注解后处理器-2

五 InitDestroyAnnotationBeanPostProcessor 类 1 属性 InitDestroyAnnotationBeanPostProcessor 类用于处理初始化与销毁注解;其中第一个属性为用于标识初始化方法与销毁方法注解类型的 initAnnotationType 与 destroyAnnotationType 属性、还有一个用于标识执行顺…...

即梦(Dreamina)技术浅析(一)

1.技术架构与核心组件 2.生成模型的具体实现 3.多模态融合技术 4.训练数据与模型优化 5.用户交互与创作流程 6.技术挑战与解决方案 7.未来发展方向 1. 技术架构与核心组件 即梦的技术架构可以分为以下几个核心组件: 1.1 前端用户界面(UI) 功能模块: 文字输入框:用…...

Spring MVC(二)

介绍 Cookie 与 Session Session 类似哈希表,存储了一些键值对结构,Key 就是 SessionID,Vaule 就是用户信息,客户端发起会话的时候,服务器一旦接收,就会创建会话【也就是 Session】,通过 Sessi…...

java求职学习day15

多线程 1 基本概念 1.1 程序和进程的概念 (1)程序 - 数据结构 算法,主要指存放在硬盘上的可执行文件。 (2)进程 - 主要指运行在内存中的可执行文件。 (3)目前主流的操作系统都支持多进程&a…...

Typesrcipt泛型约束详细解读

代码示例: // 如果我们直接对一个泛型参数取 length 属性, 会报错, 因为这个泛型根本就不知道它有这个属性 (() > {// 定义一个接口,用来约束将来的某个类型中必须要有length这个属性interface ILength{// 接口中有一个属性lengthlength:number}function getLen…...

[操作系统] 进程地址空间管理

虚拟地址空间的初始化 缺页中断 缺页中断的概念 缺页中断(Page Fault Interrupt) 是指当程序访问的虚拟地址在页表中不存在有效映射(即该页未加载到内存中)时,CPU 会发出一个中断信号,请求操作系统加载所…...

【fly-iot飞凡物联】(20):2025年总体规划,把物联网整套技术方案和实现并落地,完成项目开发和课程录制。

前言 fly-iot飞凡物联专栏: https://blog.csdn.net/freewebsys/category_12219758.html 1,开源项目地址进行项目开发 https://gitee.com/fly-iot/fly-iot-platform 完成项目开发,接口开发。 把相关内容总结成文档,并录制课程。…...

14-6-1C++STL的list

(一)list容器的基本概念 list容器简介: 1.list是一个双向链表容器,可高效地进行插入删除元素 2.list不可以随机存取元素,所以不支持at.(pos)函数与[ ]操作符 (二)list容器头部和尾部的操作 list对象的默…...

vue2和vue3指令

Vue 2 和 Vue 3 的指令系统非常相似,但 Vue 3 在指令方面进行了优化和扩展。以下是 Vue 2 和 Vue 3 中指令的对比: 1. 通用指令 这些指令在 Vue 2 和 Vue 3 中都可以使用,功能一致: 指令说明v-bind绑定 HTML 属性或组件 propsv-…...

求整数的和与均值(信息学奥赛一本通-1061)

【题目描述】 读入n(1≤n≤10000)个整数,求它们的和与均值。 【输入】 输入第一行是一个整数n,表示有n个整数。 第2~n1行每行包含1个整数。每个整数的绝对值均不超过10000。 【输出】 输出一行,先输出和,再输出平均值(保留到小数点…...

CodeForces 611:New Year and Domino ← 二维前缀和

【题目来源】 https://codeforces.com/contest/611/problem/C 【题目描述】 They say "years are like dominoes, tumbling one after the other". But would a year fit into a grid? I dont think so. Limak is a little polar bear who loves to play. He has r…...

【ROS2】RViz2界面类 VisualizationFrame 详解

1、简述 VisualizationFrame 继承自 QMainWindow 和 WindowManagerInterface; 窗口顶部是常规布局:菜单栏 和 工具栏 窗口中心是 RenderPanel,用来渲染3D画面 周围是dock区域,包括:DisplaysPanel、ViewsPanel、TimePanel、SelectionPanel 和 ToolPropertiesPanel Windo…...

梯度下降法 (Gradient Descent) 算法详解及案例分析

梯度下降法 (Gradient Descent) 算法详解及案例分析 目录 梯度下降法 (Gradient Descent) 算法详解及案例分析1. 引言2. 梯度下降法 (Gradient Descent) 算法原理2.1 基本概念2.2 算法步骤2.3 梯度下降法的变种3. 梯度下降法的优势与局限性3.1 优势3.2 局限性4. 案例分析4.1 案…...

【Flutter】旋转元素(Transform、RotatedBox )

这里写自定义目录标题 Transform旋转元素可以改变宽高约束的旋转 - RotatedBox Transform旋转元素 说明:Transform旋转操作改变了元素的方向,但并没有改变它的布局约束。因此,虽然视觉上元素看起来是旋转了,但它仍然遵循原始的宽…...

大数运算之C语言实现

一、 前言 在我们代码编程过程中,我们经常需要处理各种规模的数值。从日常工作中的一些简单算术在到科学研究中的复杂计算,数字无处不在。然而,当数值变的异常庞大时,就需要用到大数运算来进行实现。本文我们将介绍大数运算的基本…...

三高“高性能、高并发、高可靠”系统架构设计系列文章

目录 高并发系统的艺术:如何在流量洪峰中游刃有余 《数据密集型应用系统设计》读后感与高并发高性能实践案例 系统稳定性与高可用保障的几种思路 软件系统限流的底层原理解析 技术解决方案调研 延迟队列调研 重试调研 异步回调调研 分库分表调研 分布式事…...