【开源设计】京东慢SQL组件:sql-analysis

devtools/2024/10/18 22:38:39/

京东慢SQL组件:sql-analysis

  • 一、背景
  • 二、源码简析
  • 三、总结

地址:https://github.com/jd-opensource/sql-analysis

一、背景

开发中,无疑会遇到慢SQL问题,而常见的处理思路都是等上线,然后由监控报警之后再去定位对应慢SQL,随后定位问题,进行优化处理,这一出现是在慢SQL已经发生了的情况下的。

而这个 sql-analysis 开源组件是作用于 慢SQL发生之前,这种方式可以在事前尽可能地对慢SQL进行控制和处理。实现思路也很简单,就是通过Mybatis的插件机制,拦截语法分析前,以 Explain 分析结果 + 规则引擎匹配 的方式进行分析,以一种积分的判断的方式得出这个是否符合最终慢SQL的条件,符合的话进行采集,而后开发人员可以针对SQL看是否可以优化。

有了它即可:即可提前发现慢 SQL,提前做好一定的防控

在这里插入图片描述

像这种使用Mybatis插件机制去实现某一功能还有很多:
像我之前实现的分库分表组件,是否需要进行分表逻辑,修改SQL表的信息(对应starters地址:https://github.com/koxumeiqi/-starters- );
像Mybatis-plus对Mybatis拓展实现的插件;
像Mybatis分页插件等等…

使用的话很简单,就正常使用,然后它会拦截做一些事情就是,现在咱看一下它到底咋实现的,做了哪些事情。

二、源码简析

  1. 对语法分析阶段进行个采集:
    在这里插入图片描述

  2. 去获取对应执行SQL的完整语句

    • 获取对应的MappedStatement,然后获取到对应的sql,这个sql是待预处理的,就是说带 ?

      • 在这里插入图片描述
    • 对这个SQL进行个检查(是否分析过、是否是需要分析的类型Type、是否是黑名单里的SQL)

      • 在这里插入图片描述
    • 获取到转换后的SQL,就是把?转换为了对应真实值

      • 在这里插入图片描述
        提取出来的SQL长下面这样:
        在这里插入图片描述
  3. 拿到提取的SQL去Explain做分析,把分析的结果封装成 List,SqlAnalysisResult里面存了我们Explain出来的各种信息
    在这里插入图片描述

  4. 然后去拿到分析出来的结果去做评估,去打分

    • 匹配减分规则
      • 这些规则都是配的(启动的时候会解析)在这里插入图片描述
        在这里插入图片描述

随后去减分,去统计综合的分数,看是否达到了预警,达到了设个标志位为true,后续采集/输出时可以作为判别依据:
在这里插入图片描述

  1. 做输出/采集处理(这里默认是打印Error日志)

在这里插入图片描述
默认实现就是打印对应规则的原因和建议:
在这里插入图片描述

三、总结

总流程如下:

在这里插入图片描述
整体给人感觉还是很简单的,但是它确实是一个慢SQL预防的一个思路吧,而且是提前预防。


http://www.ppmy.cn/devtools/28297.html

相关文章

Spring:SpringBoot项目中忽略某属性返回给前端

文章目录 一、忽略实体类中的属性1、JsonIgnore2、JSONField(serialize false)3、JsonInclude 二、忽略实体类中的方法返回值 一、忽略实体类中的属性 1、JsonIgnore JsonIgnore注解是Jackson库中的一个注解,用于在实体类向前台返回数据时忽略不想传递给前台的属…

Django初步了解

目录 一、什么是Django 二、Django的设计模式 三、涉及的英文缩写及其含义 四、安装(官方教程) 一、什么是Django Django是一个Python Web框架,可以快速开发网站,提供一站式的解决方案,包括缓存、数据库ORM、后台…

c++ 随机数

在 C 中生成随机数通常需要使用随机数生成器。C11 引入了 <random> 头文件&#xff0c;其中包含了用于生成随机数的类和函数。 1. 随机选择一个数 #include <iostream> #include <random>int main() {// 创建一个 random_device 对象用于生成随机种子std:…

深入探索 MySQL:成本模型解析与查询性能优化

MySQL作为最流行的关系型数据库管理系统之一&#xff0c;在各种应用场景中都有着广泛的应用。 然而&#xff0c;在处理大规模数据时&#xff0c;查询性能往往成为了关注焦点。 本文将深入探讨MySQL的成本模型&#xff0c;解析其工作原理&#xff0c;并提供一系列优化策略&…

Word域代码学习(简单使用)-【SEQ】

Word域代码学习(简单使用)-【SEQ】 快捷键 序号快捷键操作1 Ctrl F9 插入域代码花括号2 F9 显示域代码结果3 Shift F9 切换为域代码4 Windows Alt F9 切换全部域代码 域代码说明 域代码不区分大小写在word中&#xff0c;依次选择插入➡文档部件➡域即可选择插入…

Unity类银河恶魔城学习记录15-5,6 p157 Audio time limiter p158 Area sound

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​ AreaSound.cs using System.Collections; using System.Collections.G…

alsactl 保存音频配置

在root下执行 1、关闭音频通道 amixer cset numid2,ifaceMIXER,namePlayback Path OFF2、保存关闭的音频通道 alsactl store -f /var/lib/alsa/asound.state3、恢复保存关闭的音频配置 alsactl restore -f /var/lib/alsa/asound.state4、打开音频通道 amixer cset numid2,ifac…

Python | Leetcode Python题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; class Solution:def uniquePaths(self, m: int, n: int) -> int:return comb(m n - 2, n - 1)