MySql explain 详解
2024-07-21 14:52:31 0 举报
AI智能生成
SQL优化20连击
作者其他创作
大纲/内容
id(select唯一标识)
select 列的序号,决定了表执行的顺序
序号大的先执行,序号相同从上到下
select_type(select类型)
SIMPLE(简单SELECT)
简单SELECT查询,不包含子查询和UNION
PRIMARY(最外层SELECT)
复杂查询中的最外层查询,表示主要的查询
UNION(UNION后的第二个或更后面的SELECT)
UNION关键字之后的查询
DEPENDENT UNION(UNION后的第二个或更后面的SELECT,取决于外部查询)
UNION RESULT(UNION的结果)
从UNION后的表获取结果集
SUBQUERY(第一个select子查询)
SELECT或WHERE列表中包含了子查询
DEPENDENT SUBQUERY(第一个select子查询,取决于外部查询)
DERIVED(派生表)
FROM列表中包含的子查询,即衍生
MATERIALIZED(物化子查询)
UNCACHEABLE SUBQUERY(子查询,其结果无法缓存)
UNCACHEABLE UNION(UNION后的第二个或更后面的SELECT,其结果无法缓存)
table(表名称)
表示输出行所引用的表的名称
其他
<unionM,N>
指定id行M,N的并集
<derivedN>
指定id行的派生表
<subqueryN>
指定id行的子查询结果
partitions(匹配的分区)
表示查询将从中匹配记录的分区
type(连接类型)
system > const > eq_ref > ref > range > index > ALL
system(表示只有一条记录)
const(通过索引一次就能找到)
eq_ref(用于主键或唯一索引扫描)
ref(用于非主键和唯一索引扫描)
fulltext(全文扫描)
ref_or_null(类似于ref,还会扫描null的数据)
index_merge(多种索引合并的方式扫描)
unique_subquery(类似于eq_ref,条件用于in子查询)
index_subquery(类似于ref,条件用于in子查询)
range(范围扫描)
index(全索引扫描)
ALL(全表扫描)
possible_keys(可能的索引选择)
key(实际用到的索引)
key_len(实际索引长度)
表示使用索引的长度,进一步看出索引使用是否充分
三因素
字符集
字符编码
GBK(2)
UTF8(3)
ISO8859-1(1)
GB2312(2)
UTF-16(2)
字段类型
char(n) -> n
varchar(n) -> n+2
tinyint -> 1
smallint -> 2
int -> 4
bigint -> 8
date -> 3
timestamp -> 4
datetime -> 8
长度
UTF-8字符编码,varchar(30) 允许空的普通索引:3 * 30 + 2 + 1
是否为空
允许为空则加1个字节
ref(与索引比较的列)
表示索引命中的列或者常量
rows(预计要检查的行数)
表示执行查询必须检查的行数
filtered(按表条件过滤的行百分比)
Extra(附加信息)
Impossible WHERE
表示WHERE后面的条件一直都是false
Using filesort
表示按文件排序,一般是索引排序无法使用
Using index
表示是否所有获取的列都走了索引
Using temporary
表示是否使用了临时表,常见与order by,group by
Using where
表示使用了where条件过滤
Using join buffer
表示是否使用连接缓冲
索引优化的过程
1.先用慢查询日志定位具体需要优化的sql
2.使用explain执行计划查看索引使用情况
3.重点关注:
key(查看有没有使用索引)
key_len(查看索引使用是否充分)
type(查看索引类型)
Extra(查看附加信息:排序、临时表、where条件为false等)
4.根据上1步找出的索引问题优化sql
5.再回到第2步
0 条评论
下一页