Q:如果一个SQL语句很慢,如何分析
先通过Skywalking开源工具定位到慢SQL,然后再通过在慢SQL语句前面加上关键字Explain,他可以获取MySQL执行SQL语句的信息,然后我们可以通过这些信息来分析原因
- possible_keys:当前SQL可能会使用到的索引
- key:当前SQL实际命中的索引
- key_len:索引占用的大小
- extra:额外的优化建议
- Using where;Using Index:查找使用了索引,需要的数据都在索引列中,不需要回表查询
- Using index condition:查找使用了索引,但是执行了回表查询
- type:这条SQL语句的连接的类型,性能由好到差分别有
- NULL、system:很少见基本用不上,NULL是没查询表,system是查询系统表
- const:根据主键查询
- eq_ref:根据主键索引查询或唯一索引查询------(查询出一条数据)
- ref:索引查询------------------(很可能查询出多条数据)
- range:范围查询
- index:全索引查询
- all:全表查询
通过Key和Key_len检查是否命中了索引(索引可能失效)
通过type字段查看sql是否有进一步优化的空间,是否存在全索引查询和全表查询
通过extra判断是否出现了回表查询,可以通过覆盖索引来修复
Q:在MySQL中如何定位慢查询
慢查询的原因
- 聚合查询
- 多表联查
- 表数据量过大查询
- 深度分页查询
如何定位慢查询
- 方案一:开源工具
- 调试工具:Arthas(阿尔萨斯)---可以使用命令的方式监控已经上线的项目,可以跟踪执行比较慢的方法,然后查看方法的执行时间,就可以确定哪里出了问题
- 运维工具:Prometheus(破米修斯)、Skywalking(死盖窝King)---在监控中有指标的数据,可以实时查看接口的相应数据,排序按响应时间长短排序
- 方案二:MySQL自带的慢日志查询
- 慢日志查询记录了所有执行时间超过了指定参数(默认10秒)的所有SQL语句的日志,如果要开启慢日志查询,需要在MySQL的配置文件/etc/my.cnf中配置信息
#开启MySQL慢日志查询开关 slow_query_log=1 #设置慢日志的时间为2秒 log_query_time=2
Q:知道什么是覆盖索引吗?
覆盖索引呢主要是用于解决回表查询的一种手段,本意是让索引本身就包含查询所需的字段,这样他就不会进行回标,会直接返回数据。
覆盖索引的实现方式:
复合索引:将所需的多个字段在进行回标查询的时候,组合成一个新的字段,在执行查询时就能避免回表查询
优点
- 避免回表:直接通过索引返回结果,减少磁盘 I/O(尤其对随机 I/O 密集型查询)。
- 索引体积小:通常比全量数据小,缓存命中率更高。
- 减少锁争用:仅访问索引,减少对数据行的锁定。
缺点
- 空间开销:需额外存储字段,增加索引体积。
- 维护成本:插入 / 更新时需同时更新索引,写性能略有下降。
- 适用范围有限:仅适用于查询字段完全被索引覆盖的场景。
应用场景:
对频繁执行的查询(如报表统计)创建覆盖索引。
覆盖索引扫描代替全表扫描