前言
慢查询优化对于提高MySQL数据库的性能和稳定性非常重要,大家在日常开发工作中一定会遇到速度比较慢的SQL语句,从而使得系统性能受到比较大的影响。慢查询优化也是面试中非常经常被问到的知识点!
一、如何做慢查询优化
Mysql慢查询优化主要就是首先定位慢查询。之后查看执行计划,对指定语句进行分析和优化,从而提升性能。
步骤为:
- 开启数据库慢查询日志定位慢查询SQL
- 使用explain进行语句分析
- 根据执行计划的内容来针对性优化语句
二、执行计划
1. 什么是执行计划?
MySQL执行计划是MySQL数据库系统在执行SQL语句时生成的详细计划,用于描述如何执行该语句,包括每个步骤的执行顺序、数据访问方式、操作类型等。
执行计划提供了有关查询性能的有价值信息,例如查询优化器选择了哪些索引、执行顺序、使用了哪些子查询、使用了哪些连接等。通过分析执行计划,开发人员可以识别潜在的性能问题,并优化查询以提高性能。
在MySQL中,可以使用EXPLAIN语句来获取查询的执行计划。
三、执行计划详解
1. 如何使用执行计划?
在MySQL中,可以使用explain + sql语句来看到该条语句的执行计划。
2. 执行计划参数列表
在MySQL中,可以使用explain + sql语句来看到该条语句的执行计划。
可以看到我们在查看执行计划后出现了如下结果:
有如下内容:
参数 | 描述 |
---|---|
id | 查询的id列表,如果musql执行了多次会有多条记录,id越小表示越先执行 |
select_type | 描述了该语句的查询类型,包括简单查询、子查询等等 |
table | 查询涉及的表名 |
partitions | 查询分区,如果表是分区表的时候会有结果,一般为空 |
type | 查询访问表的方式。它提供了关于查询优化器如何处理查询的信息 |
possible_keys | 可能使用到的索引 |
key | 实际使用到的索引 |
key_len | 使用的索引长度 |
ref | 表示查询优化器在执行查询时使用了哪些索引来访问表 |
rows | 预计查询需要扫描的行数 |
extra | 额外的执行信息,如排序、分组、使用临时表等 |
查看执行计划后,主要需要关注它的索引命中情况key字段(若该字段不存在,那么优化目标就很明确了,首先需要添加索引并命中)、row字段表示行数,理论行数越小查询越快、以及tyep、ref、extra字段,这三个字段的内容标记会比较多,需要额外关注和了解。
下面就详细介绍下这几个字段:
type字段:
type字段表示查询优化器为查询选择的访问类型,type字段的常见值如下:
查询效率ALL最慢,eq_ref最快。所以我们在慢查询优化中,需要关注该字段来了解查询优化器的访问类型,优化目标根据业务来看,一般要优化为range,对应扫描的row字段也会变小,查询耗时肯定也是会有明显提升。
ref字段:
通过分析ref字段,可以了解查询优化器在执行计划中使用了哪些索引来进行查找。这可以帮助您确定是否使用了正确的索引、是否可以通过更改查询或索引来提高性能等。
ref字段主要的内容如下,除了下面常见的值之外,ref字段还可能包含其他值,例如函数名、别名等。这些值表示查询优化器在执行计划中使用了特定的索引或函数来进行查找。
Extra字段:
extra的字段内容比较多,是额外信息,有时候我们在排查一些慢查询的问题时比较重要,明明命中了索引可还是比较慢,可能可以在extra找到原因,比较额外的排序filesort可能会导致查询缓慢。extra主要内容如下:
四、总结
其实mysql慢查询优化并不复杂,熟悉了执行计划之后,去进行索引方面的优化就行了,然后再根据执行计划就可以明确的知道优化效果了。掌握了执行计划,再也不怕面试的时候被问到数据库优化了!