MySQL——分析查询语句:EXPLAIN

概述

定位了查询慢的SQL之后,我们就可以使用EXPLAIN或 DESCRIBE工具做针对性的分析查询语句。DESCRIBE语句的使用方法与EXPLAIN语句是一样的,并且分析结果也是一样的。

MysQL中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供它认为最优的执行计划(他认为最优的数据检索方式,但不见得是DBA认为是最优的这部分最耗费时间)。

这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。MySQL为我们提供了EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,大家看懂EXPLAIN语句的各个输出项,可以有针对性的提升我们查询语句的性能。

版本情况

  • MySQL 5.6.3以前只能EXPLAIN SELECT;MYSQL 5.6.3以后就可以EXPLAIN SELECT,UPDATE,DELETE。
  • 在5.7以前的版本中,想要显示partitions需要使用explain partitions命令;想要显示使用explain extended命令。在5.7版本后,默认explain直接显示partitions和filtered中的信息。

基本语法

EXPLAN或DESCRIBE语句的语法形式如下:

EXPLAIN SELECT select_options
或
DESCRIBE SELECT select_options

如果我们想看看某个查询的执行计划的话,可以在具体的查询语句前边加一个EXPLAIN,就想这样:

EXPLAIN SELECT 1;

使查询执行起来更高效。其实除了以SELECT开头的查询语句,其余的DELETE、INSERT、REPLACE以及UPDATE语句等都可以加上EXPLAIN,用来查看这些语句的执行计划,只是平时我们对SELECT语句更感兴趣。

注意:执行EXPLAIN时并没有真正的执行该后面的语句,因此可以安全的查看执行计划。

EXPLAIN语句输出的各个列的作用如下:
在这里插入图片描述

数据的准备

1.建表
在这里插入图片描述
在这里插入图片描述
2.设置参数 log_bin_trust_function_creators
创建函数如果报错,需要开启如下命令:

set global log_bin_trust_function_creators = 1;

3、创建函数
在这里插入图片描述
4.创建存储过程
在这里插入图片描述
在这里插入图片描述
5、调用存储过程
向两个表中都加入一万条数据

CALL insert_s1(10001,10000);
CALL insert_s2(10001,10000);

explain字段剖析

  • table:表名
    查询每一个记录都对应一个单表
explain select * from s1;

s1是驱动表,s2是被驱动表

扫描二维码关注公众号,回复: 14402289 查看本文章
explain select * from s1 inner join s2;
  • id:在一个大的查询语句中每个select关键字都对应一个唯一id

  • select_type:select关键字对应的那个查询的类型,确定小查询在整个大查询中扮演什么角色

查询语句中不包含‘union’或者子查询的查询都算作‘simple’类型

explain select * from s1;

在这里插入图片描述

连接查询也算是simple类型

explain select * from s1 inner join s2;

在这里插入图片描述
对于包含 UNION或者UNION ALL '或者子查询的大查询来说,它是由几下小查询组成的,其中最左边的/查询的select type值就是PRIMARY

explain select * from s1 union select * from s2;

在这里插入图片描述
对于包含UNION或者UNION ALI 的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小以外,其余的小查询的select type值就是UNION

'MySQL 选择使用临时表来完成UNION查询的去重工作,针对该临时表的查询的'select type 就是UNION RESULT

explain select * from s1 union select * from s2;

在这里插入图片描述
子查询:
如果包含子查询的查询语句不能够转为对应的semi-join'的形式,并且该子查询是不相关子查询。
该子查询的第一个SELECT关键字代表的那个查询的select type '就是SUBQUERY

explain select * from s1 where key1 in(select key1 from s2) or key3 = 'a';

在这里插入图片描述
 在这里插入图片描述
在这里插入图片描述 在这里插入图片描述
 
在这里插入图片描述 
太多了,记不住了,学下一个内容吧还是。

猜你喜欢

转载自blog.csdn.net/xiaowanziddd/article/details/125742729