explain 慢sql优化

在每个人的项目中或多或少都会存在慢sql,慢了影响用户体验,mysql 提供了慢sql 分析工具 explain,反正我每次都是记不住explain 相关的一些属性以及用法,这里就记录一下,方便以后慢sql分析

一.explain属性

在这里插入图片描述

字段 解释
id 每个被独立执行的操作标识,标识对象被操作的顺序,id值越大,先被执行,如果相同,执行顺序从上到下
select_type 查询中每个select 子句的类型
table 被操作的对象名称,通常是表名,但有其他格式
partitions 匹配的分区信息(对于非分区表值为NULL)
type 连接操作的类型
possible_keys 可能用到的索引
key 优化器实际使用的索引(最重要的列) 从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL。当出现ALL时表示当前SQL出现了“坏味道”
key_len 被优化器选定的索引键长度,单位是字节
ref 表示本行被操作对象的参照对象,无参照对象为NULL
rows 查询执行所扫描的元组个数(对于innodb,此值为估计值)
filtered 条件表上数据被过滤的元组个数百分比
extra 执行计划的重要补充信息,当此列出现Using filesort , Using temporary 字样时就要小心了,很可能SQL语句需要优化

1.select_type类型
SIMPLE:简单SELECT查询,查询中不包含子查询或者UNION
PRIMARY:查询中包含任何复杂的子部分,最外层的查询
SUBQUERY:SELECT或WHERE中包含的子查询部分
DERIVED:在FROM中包含的子查询被标记为DERIVER(衍生), MySQL会递归执行这些子查询,把结果放到临时表中
UNION:若第二个SELECT出现UNION,则被标记为UNION, 若UNION包含在FROM子句的子查询中,外层子查询将被标记为DERIVED
UNION RESULT:从UNION表获取结果的SELECT

2.type类型
system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现
const:如果通过索引依次就找到了,const用于比较主键索引或者unique索引。 因为只能匹配一行数据,所以很快。如果将主键置于where列表中,MySQL就能将该查询转换为一个常量
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回所有匹配 某个单独值的行,然而它可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体
range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是在你的where语句中出现between、<、>、in等的查询,这种范围扫描索引比全表扫描要好,因为只需要开始于缩印的某一点,而结束于另一点,不用扫描全部索引
index:Full Index Scan ,index与ALL的区别为index类型只遍历索引树,这通常比ALL快,因为索引文件通常比数据文件小。 (也就是说虽然ALL和index都是读全表, 但index是从索引中读取的,而ALL是从硬盘读取的)
all:Full Table Scan,遍历全表获得匹配的行

3.Explain信息中Extra字段解释
(1)Using filesort(重要指标)
(2)Using temporary(重要指标)
(3)Using index(重要指标)
(4)Using where(一般重要指标)
(5)Using join buffer(一般重要指标)
(6)impossible where(一般重要指标)
(7)select tables optimized away(不常用指标)
(8)distinct(不常用指标)
Extra字段解释详细可以看这篇文章

二.show profile查询SQL语句在服务器中的执行细节和生命周期

Show Profile是MySQL提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于SQL的调优测量,默认关闭,并保存最近15次的运行结果
分析步骤
1、查看状态:SHOW VARIABLES LIKE ‘profiling’;
2、开启:set profiling=on;
3、查看结果:show profiles;
4、诊断SQL:show profile cpu,block io for query 上一步SQL数字号码;
在这里插入图片描述

ALL:显示所有开销信息
BLOCK IO:显示IO相关开销
CONTEXT SWITCHES:显示上下文切换相关开销
CPU:显示CPU相关开销
IPC:显示发送接收相关开销
MEMORY:显示内存相关开销
PAGE FAULTS:显示页面错误相关开销
SOURCE:显示和Source_function,Source_file,Source_line相关开销
SWAPS:显示交换次数相关开销

注意(遇到这几种情况要优化)
converting HEAP to MyISAM: 查询结果太大,内存不够用往磁盘上搬
Creating tmp table:创建临时表
Copying to tmp table on disk:把内存中的临时表复制到磁盘
locked

三.SQL数据库服务器参数调优

当order by 和 group by无法使用索引时,增大max_length_for_sort_data参数设置和增大sort_buffer_size参数的设置

猜你喜欢

转载自blog.csdn.net/hsadfdsahfdsgfds/article/details/131281264