mysql explain 执行计划

小可大魔王的个人博客 冲!~~ 本文由博客端 http://xiaokedamowang.cn 主动推送

mysql explain 执行计划

一. 什么是执行计划

执行计划可以模拟优化器执行 sql, 分析查询语句的性能瓶颈

# select 前面加上explain就可以查看执行计划
explain SELECT
	u.*,
	r.`name` 
FROM
	sys_user u
	JOIN user_role us ON us.user_id = u.id
	JOIN role r ON r.id = us.role_id
	where u.id < (select avg(id) from sys_user)

image-20210812231623583

二. id(不重要)

id 是执行 sql 的顺序, 越大越早执行, id 相同, 从上往下执行, id 为 Null 最后执行

三. select type(不重要)

select type 表示是简单还是复杂的查询。

  1. simple:简单查询。查询不包含子查询和 union
  2. primary:复杂查询中最外层的 select
  3. subquery:包含在 select 中的子查询(不在 from 子句中)
  4. derived:包含在 from 子句中的子查询。MySQL 会将结果存放在一个临时表中,也称为派生表。
  5. union:在 union 关键字随后的 selelct。

四. table

使用了哪个表, 有时不是真实的表名, 可能是临时表

五. type(重要)

常用的类型有: ALL、index、range、index_merge 、ref、eq_ref、const、system、NULL(从左到右,性能从差到好)

一般需要达到 range 及以上

  1. ALL 全表扫描
  2. index 覆盖索引,扫描了全部的索引 并且 select 查询的字段, 在索引里面就可以找到
  3. range 范围查找 >, <, in, between
  4. index_merge 使用了索引合并优化 就是 where 条件 or 的字段都是索引
  5. ref 非唯一索引扫描
  6. eq_ref 唯一索引扫描
  7. const 常量 where 条件指定了写死的值, 并且走了唯一索引或主键
  8. system 表里只有一条记录, 并且是 const 级别, 是 const 的特例
  9. NULL 执行阶段不用再访问表

六. possible_keys(不重要)

查询可能用到的列, 但并不一定用到

七. key(重要)

实际真正用到的索引, 如果为 NULL, 表示没有用到索引

八. key_len(或许重要)

使用的索引长度, 可以根据长度算出组合索引用了哪些列

规则如下:

  1. 允许为空 长度 1

  2. 字符串 UTF8 每个字符长度为 3 UTF8MB4 每个字符 4 字节

    • char

      UTF8MB4 编码的 char(20) 允许为 NULL 长度位: 20 * 4 + 1 = 81

    • varchar

      字符串保存长度再加 2

      UTF8MB4 编码的 varchar(20), 允许为 NULL 长度位: 20 * 4 + 2 + 1 = 83

  3. 数字

    • tinyint: 1 字节
    • smallint: 2 字节
    • int: 4 字节
    • bigint: 8 字节
  4. 时间

    • date: 3 字节
    • timestamp: 4 字节
    • datetime: 8 字节
索引最大长度是 768 字节,当字符串过长时, 会截取前半段

九. ref(不重要)

一般为表关联的列

十. rows(不重要)

估算的结果集行数

十一. Extra(比较重要)

  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    317 引用 • 1390 回帖 • 9 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    320 引用 • 602 回帖 • 1 关注
1 操作
xiaokedamowang 在 2021-08-13 02:31:49 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...