【学习总结】慢SQL治理经验总结

一、慢SQL定义

        执行超过1s的SQL为慢SQL

 三、慢SQl的风险

  1. 系统的响应时间延迟,影响用户体验

  2. 资源占用增加,增高了系统的负载,其他请求响应时间也可能会收到影响。

  3. 慢SQL占用数据库连接的时间长,如果有大量慢SQL查询同时执行,可能会导致数据库连接池的连接被全部占用,导致数据连接池打满、缓冲区溢出等问题,使数据库无法响应其他请求。(影响业务连续性,系统崩了)

  4. 还有可能造成锁竞争增加、数据不一致等问题

四、慢SQL是如何引入的

  1. 缺乏索引/索引未生效,导致数据库全表扫描,会产生大量的IO消耗,产生慢SQL。

  2. 单表数据量太大,会导致加索引的效果不够明显。

  3. SQL语句书写不当,例如join或者子查询过多、in元素过多、limit深分页问题、order by导致文件排序、group by使用临时表等。

  4. 数据库在刷“脏页”,redo log写满了,导致所有系统更新被堵住,无法写入了。

  5. 执行SQL的时候,遇到表锁或者行锁,只能等待锁被释放,导致了慢SQL。

五、如何发现慢SQL及高危SQL

  1. 数据库会将执行慢SQL日志
  2. 其他的数据库性能监控工具、SQL性能分析工具
  3. 发现全量SQL,把系统所有SQL采集起来
  • 除了执行时长超过1s的慢SQL之外,我们还额外关注了未来可能劣化的慢SQL,这样就需要获取全量SQL,再对其进行分析,筛选出其中风险较大的SQL。我们采取了如下方法
  • 基于JVM Sandbox进行SQL流水记录的采集

识别慢SQL的标准

  • 根据历史慢SQL治理经验,我们把高危SQL分为以下几类:

  • 不符合集团SQL规约的SQL,可能会埋坑,造成线上问题,影响执行效率等。

  • 通过对SQL语句分析,发现SQL索引使用不当、造成全表扫描,或者SQL扫描行数过多、出现文件排序等。这种SQL即使当前不是慢SQL,随着表数据量的膨胀,未来也可能发展为慢SQL。

  • SQL执行时间过长,比较容易理解。对慢SQL来说,执行时间越长,风险越高

SQL规约

  1. 【强制】不要使用count(列名)或count(常量)来替代count(*),count(*)就是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。

  2. 【强制】count(distinct col) 计算该列除NULL之外的不重复数量。注意 count(distinct col1, col2) 如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0。

  3. 【强制】当某一列的值全是NULL时,count(col)的返回结果为0,但sum(col)的返回结果为NULL,因此使用sum()时需注意NPE问题。

  4. 【强制】使用ISNULL()来判断是否为NULL值。

  5. 【强制】对于数据库中表记录的查询和变更,只要涉及多个表,都需要在列名前加表的别名(或表名)进行限定。

  6. 【强制】在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。

  7. 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。

  8. 【强制】禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。

  9. 【强制】IDB数据订正(特别是删除或修改记录操作)时,要先select,避免出现误删除,确认无误才能提交执行。

我们使用了Druid SQL Parser进行SQL解析,Druid SQL Parser是阿里巴巴的开源项目,可以将SQL语句解析为语法树,可以解析SQL的各个部分,如SELECT语句、FROM语、WHERE语句等,并且可以方便获取SQL语句的结构信息,如表名、列名、操作符等。通过分析SQL,可以轻松判断SQL是否符合规约

SQL索引

我们重点关注的点如下:

  1. 使用全表扫描,性能最差,即type="ALL"

  2. 扫描行数过多,即rows>阈值

  3. 查询时使用了排序操作,也比较耗时,即Extra包含"Using filesort"

  4. 索引类型为index,代表全盘扫描了索引的数据,Extra信息为Using where,代表要搜索的列没有被索引覆盖,需要回表,性能较差。

以上几点都可能造成SQL性能的劣化,是我们需要额外关注的高风险sql

六、如何推动治理慢SQL

存量慢SQL治理

存量慢SQL治理的难点在于,历史遗留下的慢SQL可能量级很大,所以要区分慢SQL治理的优先级。我们制定了健康分机制,对SQL分批分级治理。

对慢SQL来说,健康分主要受SQL的执行次数、扫描行数、执行时长影响。另外根据应用中包含慢SQL的数量、平均SQL执行数据等,给应用打出健康分。再根据部门维度汇总,根据应用等级、应用健康分情况等,计算出部门维度的健康分。

原文链接        SQL高发团队等,进行集中的推进治理SQL高发团队等,进行集中的推进在慢SQL推动治理方面,高危慢SQL,会建立Issue持续追踪,Issue存在超期时间,超期后会影响团队健康分。另外,提供应用维度、部门维度的整体慢SQL风险大盘以及排名,针对重点业务、慢SQL高发团队等,进行集中的推进治理

增量慢SQL治理

我们希望增量慢SQL能在上线前得到解决,即分支内不要引入慢SQL或者风险SQL,我们建立了开发环境下增量慢SQL发现机制,并建立发布前卡点能力。整体流程如下:

增量慢SQL的修复代价是小于存量慢SQL的,因此这里我们添加了分支定位的能力。同一应用存在多个同学共同开发的情况,有效的分支定位,可以准确指派慢SQL引入人,实现快速推动治理。这里以git上代码改动为切入点,完成了引入慢SQL的sql_map与修改人之间的关系映射,大致逻辑如下:

a. 监听应用部署消息

b. 获取应用信息,拿到git地址

c. 将本次部署分支与master分支做分支diff

d. 解析sql_map文件,获取本次修改的sql内容

e. 记录被修改sql_id与分支的对应关系

f. 根据sql_id查询对应分支

……

这样就可以精准匹配到增量SQL的引入分支,从而指派到开发者,实现了定向问题指派和追踪,并且可以方便完成分支发布前的管控能力。如果存在增量慢SQL,分支发布,合并到master之前,会触发卡点,需要问题解决才能发布

七、学习总结

本篇文章非常优秀,从技术,管理,制度,组织各个层面介绍了如何治理慢SQL,堪称教科书级别的。

技术:标准,风险,原因,自动化

管理:问题识别,问题跟踪到责任人及部门,且配合自动化的工具

制度:慢SQL排名,打分到个人,应用,部门,加上奖惩制度等

组织:公共的团队及监测系统来做治理这件事

八、亮点

  1. 采集全量SQL的自动化工具,解放dba人工分析慢SQL,极大提升效率
  2. SQL健康分评价体系
  3. 流程管理自动化体系
  4. 提前预警慢SQL及风险SQL自动化检测工具

九、实施思考

上面的方案堪称完美方案,但是大部分公司都不具备完全执行的条件

主要卡点:dba数量都不够,采集工具不具备,流程制度不具备,人力安排不具备

实施慢SQL本身这件事的卡点有那些?

  1. 业务需求多,业务团队如果是没有出生产事故的情况下,是不愿意主动投入资源做优化的,且优化还有风险
  2. 慢sql有的是架构不合理,数据结构本身不合理,更本不能单纯通过SQL本身去优化,完成优化涉及的范围面比较大,阻碍大
  3. 业务团队的技术支持不行,没办法优化慢SQL,优化慢SQL的风险意识不够
  4. 慢SQL的发现工具不够完善,不能及时高效发现
  5. 慢SQL的预防,治理及简单规范没有
  6. 考核本身

如果是一个小公司要执行慢sql治理,核心治理方案怎么制定?

  1. 慢SQL定义:再小的团队一个架构师,技术经理都能出一个团队范围内的定义
  2. 慢SQL的风险及如果引入:认知培训及意识培养,小团队能进行
  3. 慢SQL的发现:通过数据库自带的慢SQL日志发现慢SQL一般效率比较低,可以借鉴一些开源功能,或开发一些简单脚本定时做巡检分析那些慢SQL,比如dba一个季度出一次分析报告给到研发团队
  4. 研发要么从dba哪里获取慢SQL分析报告,要么有比较友好的入口可以自己检查看,这个比较重要
  5. 慢sql找到后,安装技术优化排期解决并考核
  6. 宣讲研发阶段怎么避免慢sql引入,团队知识升级

两三个人的团队都可以按照上面的流程来优化,不一定要非常完善的方案,这样投入产出比不划算,没有完美的方案只有适合的最佳方案;我们公司好几百个系统,研发上千人,dba才20人不到,根本没资源做

核心关键

  1. 慢sql的第一责任人研发,第二责任人dba,第三责任人sre;
  2. 慢sql的风险及收益,宣讲培养
  3. 考核


 

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

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

相关文章

Waline评论服务端转移至Deta

旧文首发地址 问题 前阵子评论系统又挂了,原因是*.vercel.app域名被污染。 解决方法 法一:服务端换个域名 法二:换个服务端部署 我选法二。 步骤 DETA官网:https://www.deta.sh/ Deta is free for ever. 这句话很不错有木有…

C语言中的assert.h:调试助手与断言详解

在C语言编程中,assert.h头文件提供了非常有用的断言(Assertion)功能,它主要用于开发和调试阶段,确保程序在运行时满足某些预期条件。如果这些条件未得到满足,则程序会立即停止执行,并打印出有关…

【MySQL】解决在join表时一对多的情况下重复数据的问题

在MySQL中进行JOIN操作,特别是在处理一对多关系的表时,可能会出现重复的记录,这是因为左表(或右表)中的每一项在与右表(或左表)连接时,如果对应有多条匹配记录,则会生成多…

冷链物流追踪:Java与MySQL的协同实践

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

第三百六十一回

文章目录 1. 概念介绍2. 实现方法2.1 环绕效果2.2 立体效果 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义SlideImageSwitch组件"相关的内容,本章回中将介绍两种阴影效果.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

Gson 库的使用

Gson 是由 Google 开发的一个流行的 Java 库,用于处理 JSON 数据的序列化和反序列化。它提供了简单易用的 API,使得在 Java 应用程序中操作 JSON 数据变得非常方便。 以下是 Gson 库的一些主要特点和用法 简单易用 Gson 提供了一个简单而直观的 API,使得在 Java 应用程序中…

谷歌seo推广怎么做?

除了常规的优化之外,还可以针对特定垂直搜索进行优化,比如图片的以及视频的搜索优化,这对于贩卖自己产品的网站来说也是挺重要的一点 图片需要确保您的图片文件名包含相关关键词,并为每张图片添加描述性的ALT文本,以帮…

经济学-信用货币初始发行与派生

由于黄金美元的种种缺陷,经济学家找到了一种替代黄金的方案,这种替代品就是债务,它可以解决黄金有限的问题,并且债务这种抵押品耗费的人力物力远远低于其他抵押品(例如黄金还得需要开采) 假设一个国家刚刚…

调用 Python 函数遗漏括号 ( )

调用 Python 函数遗漏括号 1. Example - error2. Example - correctionReferences 1. Example - error name "Forever Strong" print(name.upper()) print(name.lower)FOREVER STRONG <built-in method lower of str object at 0x0000000002310670>---------…

Swift基础知识:22.Swift构造过程

在 Swift 中&#xff0c;构造过程是实例化一个类、结构体或枚举实例的过程&#xff0c;它包括设置实例的初始状态和执行其他必要的设置。构造过程通过定义构造器&#xff08;initializer&#xff09;来实现&#xff0c;构造器是一种特殊的方法&#xff0c;用于创建和初始化实例…

SqlServer2016离线安装--Microsoft R Open 和 Microsoft R Server安装文件位置

问题 SQL SERVE 2016离线安装&#xff0c;会出现“Microsoft R Open 和 Microsoft R Server 脱机安装”的界面&#xff0c; 无法点击下一步的情况&#xff0c;如下图&#xff1a; 原因 离线安装时需要下载两个文件 解决方案 1、访问路径下载文件 https://go.microsoft.c…

Python 实现 OBV 指标计算:股票技术分析的利器系列(7)

Python 实现 OBV 指标计算&#xff1a;股票技术分析的利器系列&#xff08;7&#xff09; 介绍算法解释 代码rolling函数介绍核心代码计算 VA 列计算 OBV 列计算 MAOBV 完整代码 介绍 OBV 指标是“On-Balance Volume”的缩写&#xff0c;意为“量价平衡指标”。它是一种用于衡…

《游戏引擎架构》 -- 学习4

资源及文件系统 文件系统 游戏引擎的文件系统API通常提供以下功能&#xff1a; 搜需路径&#xff1a;是含一串路径的字符串&#xff0c;各路径之间以特殊字符&#xff08;如冒号或分号&#xff09;分隔&#xff0c;找文件时就会从这些路径进行搜寻。例如在命令行下执行程序&a…

Code Composer Studio (CCS) - 全局搜索功能

Code Composer Studio [CCS] - 全局搜索功能 1. Ctrl H&#xff0c;全局搜索功能References 1. Ctrl H&#xff0c;全局搜索功能 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

VS和QT联合开发

提示:本文为学习记录,若有疑问,请联系作者,谦虚受教。 文章目录 前言一、安装二、新建项目1.VS打不开UI文件2.VS找不到QT对应的版本号三、其他问题1.vs无法识别加载ui新添加的控件2.UI界面出现中文乱码3.修改VS字体颜色4.自动代码补全功能5.添加<QtSerialPort/qserialpo…

【AI大模型】ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

Leetcode | 231. 2 的幂 C语言

Problem: 231. 2 的幂 文章目录 思路解题方法Code 思路 说白了就是靠硬算&#xff0c;但是要知道对sum不进行控制就会导致直接超标&#xff0c;所以要在for循环的条件中加上sum < n 解题方法 由思路可知 Code bool isPowerOfTwo(int n) {long int sum 1;for(int i 0; i &…

拉伸图片覆盖整个页面的css写法

如果您想要拉伸一张图片以覆盖整个页面&#xff0c;可以使用以下CSS代码&#xff1a; body {margin: 0;padding: 0;height: 100%;background-image: url(your-image-url.jpg); /* 替换为您的图片URL */background-size: cover;background-position: center center; /* 可选&…

vue3+vite项目中显示SVG图片

使用vite显示本地svg图标 vite-plugin-svg-icons是一个Vite插件&#xff0c;其作用是将SVG图标文件转换为Vue组件&#xff0c;以便在Vue项目中使用。 使用vite-plugin-svg-icons插件&#xff0c;可以将SVG图标文件导入到项目中&#xff0c;并将其转换为可复用的Vue组件。这样&a…

语文成绩(洛谷)

题目 原题 题目背景 语文考试结束了&#xff0c;成绩还是一如既往地有问题。 题目描述 语文老师总是写错成绩&#xff0c;所以当她修改成绩的时候&#xff0c;总是累得不行。她总是要一遍遍地给某些同学增加分数&#xff0c;又要注意最低分是多少。你能帮帮她吗&#xff1f; 输…