MYSQL_01Explain详解与索引实践
2023-04-11 16:16:49 1 举报
AI智能生成
Explain详解与索引最佳实践
作者其他创作
大纲/内容
EXPLAIN关键字
模拟优化器执行SQL语句
分析你的查询语句或是结构的性能瓶颈
如果from中包含子查询,仍会执行该子查询,将结果放入临时表中
explain两个变种
explain extended
会在 explain 的基础上额外提供一些查询优化的信息
再通过 show warnings 命令可 以得到优化后的查询语句
filtered 列
explain partitions
相比explain多了个partitions字段
explain中的列
id列
是select的序列号,有几个select就有几个id,并且id的顺序是按select出现的顺序增长的
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行
select_type列
表示对应行是简单还是复杂的查询
simple
简单查询。查询不包含子查询和union
primary
复杂查询中最外层的 select
subquery
包含在 select 中的子查询(不在 from 子句中)
derived
包含在 from 子句中的子查询
union
在 union 中的第二个和随后的 select
table列
表示 explain 的一行正在访问哪个表
from 子句中有子查询时,table列是 <derivenN> 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查 询
当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的 select 行id
type列
列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围
最优到最差分别为
system
system是 const的特例,表里只有一条元组匹配时为system
const
mysql能对查询的某部分进行优化并将其转化成一个常量
用于 primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快
eq_ref
primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记
在 const 之外最好的联接类型了
简单的 select 查询不会出现这种 type
ref
相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀
索引要和某个值相比较,可能会 找到多个符合条件的行
range
范围扫描通常出现在 in(), between ,> ,<, >= 等操作中
使用一个索引来检索给定范围的行
index
扫描全索引就能拿到结果,一般是扫描某个二级索引
直接 对二级索引的叶子节点遍历和扫描,速度还是比较慢的
这种查询一般为使用覆盖索引,二级索引一般比较小,所以这 种通常比ALL快一些
ALL
即全表扫描,扫描你的聚簇索引的所有叶子节点
通常情况下这需要增加索引来进行优化了
得保证查询达到range级别,最好达到ref
NULL
mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引
在索引列中选取最小值,可 以单独查找索引来完成,不需要在执行时访问表
possible_keys列
这一列显示查询可能使用哪些索引来查找
key列
这一列显示mysql实际采用哪个索引来优化对该表的访问
如果没有使用索引,则该列是 NULL
如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index
key_len列
这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列
计算规则
字符串
char(n):n字节长度
varchar(n):如果是utf-8,则长度 3n + 2 字节,加的2字节用来存储字符串长度
数值类型
tinyint:1字节
smallint:2字节
int:4字节
bigint:8字节
时间类型
date:3字节
timestamp:4字节
datetime:8字节
索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索 引
ref列
这一列显示了在key列记录的索引中,表查找值所用到的列或常量
rows列
这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数
Extra列
这一列展示的是额外信息
常见的重要值
Using index:使用覆盖索引
Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖
Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围
Using temporary:mysql需要创建一张临时表来处理查询
Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序
0 条评论
下一页