概述
定位了查询慢的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是被驱动表
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';
太多了,记不住了,学下一个内容吧还是。
转载:https://blog.csdn.net/xiaowanziddd/article/details/125742729