MySQL调优--04---explain

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


explain

1.概述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

在这里插入图片描述

2. 基本语法

在这里插入图片描述
在这里插入图片描述

3. 执行计划包含的信息

在这里插入图片描述

在这里插入图片描述

4. 数据准备

1 . 建表

CREATE TABLE s1 (
id INT AUTO_INCREMENT,
key1 VARCHAR(100),
key2 INT,
key3 VARCHAR(100),
key_part1 VARCHAR(100),
key_part2 VARCHAR(100),
key_part3 VARCHAR(100),
common_field VARCHAR(100),
PRIMARY KEY (id),
INDEX idx_key1 (key1),
UNIQUE INDEX idx_key2 (key2),
INDEX idx_key3 (key3),
INDEX idx_key_part(key_part1, key_part2, key_part3)
) ENGINE=INNODB CHARSET=utf8;

在这里插入图片描述
在这里插入图片描述

2 . 设置参数 log_bin_trust_function_creators
创建函数,假如报错,需开启如下命令:允许创建函数设置

set global log_bin_trust_function_creators=1; # 不加global只是当前窗口有效。

3 . 创建函数

DELIMITER //
CREATE FUNCTION rand_string1(n INT)
RETURNS VARCHAR(255) #该函数会返回一个字符串
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT
'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
SET i = i + 1;
END WHILE;
RETURN return_str;
END //
DELIMITER ;

4 . 创建存储过程
创建往s1表中插入数据的存储过程:

DELIMITER //
CREATE PROCEDURE insert_s1 (IN min_num INT (10),IN max_num INT (10))
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
REPEAT
SET i = i + 1;
INSERT INTO s1 VALUES(
(min_num + i),
rand_string1(6),
(min_num + 30 * i + 5),
rand_string1(6),
rand_string1(10),
rand_string1(5),
rand_string1(10),
rand_string1(10));
UNTIL i = max_num
END REPEAT;
COMMIT;
END //
DELIMITER ;

5 . 调用存储过程
s1表数据的添加:加入1万条记录:

CALL insert_s1(10001,10000);

在这里插入图片描述

EXPLAIN各列作用

在这里插入图片描述

1.id

id:在一个大的查询语句中每个SELECT关键字都对应一个唯一的id

  • 我们写的查询语句一般都以SELECT 关键字开头,比较简单的查询语句里只有一个SELECT 关键字

在这里插入图片描述

  • 稍微复杂一点的连接查询中也只有一个SELECT 关键字
    在这里插入图片描述
  • 多个select语句

在这里插入图片描述

  • 特殊情况
查询优化器可能对涉及子查询的查询语句进行重写,转变为多表查询的操作

例如: A表 n条记录,B表m条记录

  1. 表连接查询 select * from A left B on , 复杂度 n+m
  2. 子查询 select * from A IN (select * from B) , 复杂度 n*m

在这里插入图片描述

  • Union去重-------会生成一张临时表
    在这里插入图片描述
  • UNION ALL

在这里插入图片描述

2.table:表名

查询的每一行记录都对应着一个单表

在这里插入图片描述

在这里插入图片描述

  • s1:驱动表 s2:被驱动表

在这里插入图片描述

3.select_type

SELECT关键字对应的那个查询的类型,确定小查询在整个大查询中扮演了一个什么角色

在这里插入图片描述
在这里插入图片描述

SIMPLE`类型

  • 查询语句中不包含UNION或者子查询的查询都算作是SIMPLE类型
    在这里插入图片描述
  • 连接查询也算是SIMPLE类型
    在这里插入图片描述

PRIMARY类型

  • 对于包含UNION或者UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY
  • 对于包含UNION或者UNION ALL的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小查询 以外,其余的小查询的select_type值就是UNION
  • MySQL选择使用临时表来完成UNION查询的去重工作,针对该临时表的查询的select_type就是 UNION RESULT
    在这里插入图片描述
    在这里插入图片描述

SUBQUERY 类型

  • 如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是不相关子查询。该子查询的第一个SELECT关键字代表的那个查询的select_type就是SUBQUERY
    在这里插入图片描述
  • 如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是相关子查询,
    则该子查询的第一个SELECT关键字代表的那个查询的select_type就是DEPENDENT SUBQUERY
注意的是,select_type为DEPENDENT SUBQUERY的查询可能会被执行多次。

在这里插入图片描述

  • 在包含UNION或者UNION ALL的大查询中,如果各个小查询都依赖于外层查询的话,那除了最左边的那个小查询之外,其余的小查询的select_type的值就是DEPENDENT UNION
    在这里插入图片描述

DERIVED 类型

  • 对于包含派生表的查询,该派生表对应的子查询的select_type就是DERIVED
    在这里插入图片描述

MATERIALIZED 类型

  • 当查询优化器在执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询时,
    该子查询对应的select_type属性就是MATERIALIZED
  • 子查询被转为了物化表

在这里插入图片描述

4. partitions (可略)

在这里插入图片描述
在这里插入图片描述

5. type ☆

在这里插入图片描述

system

  • 当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是system

MyISAM 有专门一个值,来记录表记录数

CREATE TABLE t(i INT) ENGINE=MYISAM;
 INSERT INTO t VALUES(1);

在这里插入图片描述

换成InnoDB
CREATE TABLE tt(i INT) ENGINE=INNODB;
 INSERT INTO tt VALUES(1);

在这里插入图片描述

const

当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是const

在这里插入图片描述
在这里插入图片描述

ref

当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是ref

在这里插入图片描述

eq_ref

  • 连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的
  • (如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则 对该被驱动表的访问方法就是eq_ref
    在这里插入图片描述

ref_or_null

  • 当对普通二级索引进行等值匹配查询,该索引列的值也可以是NULL值时,那么对该表的访问方法
    就可能是ref_or_null
    在这里插入图片描述

index_merge

  • 单表访问方法时在某些场景下可以使用IntersectionUnion、Sort-Union`这三种索引合并的方式来执行查询
    在这里插入图片描述

unique_subquery

  • unique_subquery是针对在一些包含IN子查询的查询语句中,如果查询优化器决定将IN子查询
    转换为EXISTS子查询
    ,而且子查询可以使用到主键进行等值匹配的话,那么该子查询执行计划的type
    列的值就是unique_subquery

在这里插入图片描述

range

  • 如果使用索引获取某些范围区间的记录,那么就可能使用到range访问方法
    在这里插入图片描述
    在这里插入图片描述

index

当我们可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是index

在这里插入图片描述

ALL

最熟悉的全表扫描

在这里插入图片描述

小结

在这里插入图片描述

6. possible_keys和key

可能用到的索引 和 实际上使用的索引

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

7. key_len

  • 帮你检查是否充分的利用上了索引值越大越好,主要针对于联合索引,有一定的参考意义。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

8. ref

  • 当使用索引列等值查询时,与索引列进行等值匹配的对象信息
  • 比如只是一个常数或者是某个列。

在这里插入图片描述

  • 常数

在这里插入图片描述

  • 某个列

在这里插入图片描述

  • 函数

在这里插入图片描述

9. rows

预估的需要读取的记录条数,值越小越好

在这里插入图片描述
在这里插入图片描述

10. filtered

  • 某个表经过搜索条件过滤后剩余记录条数的百分比
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

11. Extra ☆

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述

EXPLAIN的进一步使用

EXPLAIN四种输出格式

  • 这里谈谈EXPLAIN的输出格式。EXPLAIN可以输出四种格式: 传统格式, JSON格式, TREE格式以及可视化输出。用户可以根据需要选择适用于自己的格式。

1. 传统格式

在这里插入图片描述

2. JSON格式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3. TREE格式

在这里插入图片描述

4. 可视化输出

在这里插入图片描述

在这里插入图片描述

SHOW WARNINGS的使用

在这里插入图片描述
在这里插入图片描述
案例:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值