我们在日常使用和面试中,经常遇见sql优化的问题,今天阳仔就带大家详细介绍一下mysql的优化向的知识和相关技巧;
一.哪些场景会出现慢查询?
主要体现就是查询sql 时间比较长,接口相应时间长,导致页面加载也比较慢,那么哪些情况会出现慢查询了,主要是以下几种情况:
- 聚合查询
- 多表查询
- 表数据量过大查询
- 深度分页查询
二. 如何定位慢查询了?
方案一: 开源工具(实际用的比价多)
- 调试工具: Arthas (阿里开源项目,YYDS)
官方定义: Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
主要都是命令行操作为主,官方有中文文档,使用起来比较简单,不懂的可以直接去官方查看文档.
启动界面
面板信息
如何通过Arthas 来分析慢查询了?
使用trace命令
原理就是追踪线程中具体方法的响应时间来确认慢查询,Arthas 会给出具体的追踪分析数据,可以看到具体的调用次数,总耗时,平均耗时等信息.
官方文档介绍,YYDS 啥都有
- 运维工具:
Prometheus : (2012 年的google 开源项目,且持续在运营中.)
原理: 通过http协议周期性的抓取被监控的组件的状态
中文文档地址
:https://prometheus.fuckcloudnative.io/di-yi-zhang-jie-shao/overview
系统架构
具有单独的管理界面 也可以命令行操作,也可以接入第三方工具使用.
如何使用Prometheus来定位慢查询?
- 需要在mysql中配置慢查询的日志
2,在Prometheus中安装mysql exporter 插件并配置
- 配置Prometheus
- 可视化查看慢mysql的慢查询结构 ,需要安装Grafana ,配置上Prometheus 的数据源即可
Skywalking (笔者之前就是用的这个,单体应用和微服务都可以用)
分布式系统,最合适使用的应用程序性能监控工具,提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
整体架构
中文文档地址
:https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/#
可视化界面
可以直接看到接口的执行时间,非常方便
还可以直接追踪具体的sql ,功能非常强大 ,使用也很简单
方案二: mysql 自带的慢日志查询 (只在测试环境中使用,生产环境不使用,有性能问题)
配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息
/var/lib/mysql/localhost-slow.log。
方案三: 增加系统日志
使用项目自带日志,对关键接口的相应时间 进行系统日志记录,再从代码层面反推具体的sql问题,比较适合业务量还不大的项目.
方案四 : 使用'explain'命令 进行sql 语句的解析
这个是对于比较负责的业务,在写了sql语句后,需要对sql 语句是否变慢做一个校验,主要是定位到慢SQL后的分析工作.可以配置前面的方案一起使用,可以确认以下sql 是否命中索引,是否进行了全表扫描
explain 命令
possible_key: 主要是可能用到的所有
key: 当前已经命中的索引
key_len: 索引占用的内存大小
extra : 优化的建议
type: sql的链接类型 性格: null>system (系统中的表)>const (主键)> eq_ref (主键/唯一索引)> ref (索引)>range(范围) > index (索引树)> all (全盘扫描)
一般type 为index/all 此时sql就需要优化了
哪些场景会出现慢查询? 如何定位慢查询? 如何分析慢查询? 你们的项目中都是怎么来处理了的? 评论区留下你的看法