抛问题: Explain是什么? 目录 一、Explain 1.1 explain作用 1.2 explain列说明 id select_type table partiitons type select_type possible_k
抛问题:
Explain是什么?
目录
在sql语句前添加explain,作用是查看Mysql对这条sql的执行计划信息。
思考:MYSQL执行SQL语句时一定按这个执行计划执行么?
在一条简单SQL前面添加explain查看有哪些列,如下:
每个select对应一个id值,其值是按 select 出现的顺序增长的。
注:id值越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行
每个select对应一个select_type,表示select的复杂度,有:
SIMPLE:简单查询。查询不包含子查询和uNIOn,如上图
PRIMARY:对于包含UNioN、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY
SUBQUERY:包含在 select 中的子查询(不在 from 子句中)
DERIVED:对于包含‘派生表’的查询
UNION:在 union 中的第二个和随后的 select
这一列表示 explain 的一行正在访问哪个表。
当 from 子句中有子查询时,table列是
当有 union 时,UNION RESULT 的 table 列的值为
匹配的分区信息
这一列表示关联类型或访问类型
效率从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
SQL性能优化的目标:至少要达到range
级别,要求是ref
级别,最好是consts
级别。
system
:当表中只有一条记录
并且该表使用的存储引擎的统计数据都是精确地,表最多有一个匹配行,读取1次,速度比较快。
const:system是 const的特例,表里只有一条元组匹配时为system
eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。
ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会 找到多个符合条件的行。
range:用索引获取某些范围区间
的记录。
每个select对应一个select_type,表示select的复杂度
SIMPLE:简单查询。查询不包含子查询和union,如上图
PRIMARY:对于包含UNION、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY
SUBQUERY:包含在 select 中的子查询(不在 from 子句中)
DERIVED:对于包含‘派生表’的查询
UNION:在 union 中的第二个和随后的 select
标识某个表查询时可能使用哪些索引来查找。
实际使用哪个索引。
当possible_keys有值,而key没有值时,可能是因为表数据很少,mysql认为没有必要走索引,直接全表查询了。
当possible_keys为null时,可根据实际情况在where条件中添加索引来提升查询效率。
实际使用到的索引的字节数,帮我们检查是否充分利用上了索引,对于联合索引有一定的参考意义。
比如有列n和address的联合索引(表my_datas字段有id, n, address 和 time)
key_len=5,通过计算索引占的字节数来判断出查询使用了联合索引中的第一个列。
key_len的计算:(举几个类型)
测试表test1
字符串:char(n)和varchar(n),5.0.3以后版本中,n均代表字符数,而不是字节数,如果是utf-8,一个数字或字母占1个字节,一个汉字占3个字节
varchar(n):如果存汉字则长度是 4n + 2 字节(若可为空 则+1),加的2字节用来存储字符串长度,因为 varchar是变长字符串。
col2_varchar是varchar(32),那么len应该是 32 * 4 + 2 + 1 = 131
explain中key_len值为131
数值类型:
时间类型:
注:
这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量)、字段名(库名.表名.列名 如test.test.col1_char)
这一列是mysql估计要读取并检测的行数,值越小越优
注意这个不是结果集里的行数
通过索引扫描表估计要读取并检测的行数rows。
使用额外的查询条件对rows行的数据进行过滤行得有行数n占rows的比例,
即 n/rows * 100%
sql执行计划比较重要的参考信息,常见重要信息如下:
4 Using temporary:创建一张临时表来处理查询
Using filesort:顾名思义,使用文件(磁盘中)排序。mysql做了优化,数据较少时排序是在内在中进行的,数据量较大时才会在磁盘中进行排序。出现这种情况,就要考虑添加索引来优化SQL了。
col1_char未创建索引,mysql先预览整个表对col1_char进行排序和对应的主键值序列,再通过主键值回主键索引树查询数据返回。
对col1_char添加索引之后,执行计划结果如下:
Select tables optimized away:使用函数来查询某个索引信息时
--结束END--
本文标题: MYSQL:SQL优化之Explain详解
本文链接: https://www.lsjlt.com/news/436218.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-16
2024-05-16
2024-05-16
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0