分析查询语句:EXPLAIN

这篇具有很好参考价值的文章主要介绍了分析查询语句:EXPLAIN。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

使用mysqldumpslow工具定位到慢查询语句之后,可以使用explain或describe工具做针对性的分析查询语句。

MySQL种有专门负责优化SELECT语句的优化器模块:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划。

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

二、基本语法

explain  查询语句;   select、insert、update、delete都可使用

例如:explain select * from user limit 10;

explain语句输出的各列作用如下:

列名 描述
id 在一个大的查询语句种,每一个select关键字都对应一个唯一的id
select_type select关键字对应的那个查询的类型
table 表名
partitions 匹配的分区信息
type 针对单表的访问方法
possible_keys 可能用到的索引
key 实际上用到的索引
key_len 实际用到的索引长度
ref 当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows 预估的需要读取的记录数
filtered 某个表经过搜索条件过滤后剩余记录条数的百分比
exea 一些额外信息

 

 

 

 

 

 

 

 

 

 

 

 

 

三、数据准备

执行以下代码,为分析explain做准备

#创建表
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;


CREATE TABLE s2 (
    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;

#创建存储函数:
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 ;

SET GLOBAL log_bin_trust_function_creators=1; 

#创建存储过程:
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 ;


DELIMITER //
CREATE PROCEDURE insert_s2 (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 s2 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 ;

#调用存储过程
CALL insert_s1(10001,10000);

CALL insert_s2(10001,10000);

SELECT COUNT(*) FROM s1;

SELECT COUNT(*) FROM s2;

四、explain各列详解

1、table:表名

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

explain select * from s1;
explain select * from s1 inner join s2;

分析查询语句:EXPLAIN

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

explain select * from s1where key1 = 'a';

分析查询语句:EXPLAIN

 总结:

id如果相同,可以认为是一组,从上往下执行

在所有组种,id越大,优先级越高,越先执行

每一个id号码表示一趟独立的查询,一个SQL查询的趟数越少越好。

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

①查询语句中不包含UNION或者子查询的查询都算是SIMPLE类型

explain select * from s1;

分析查询语句:EXPLAIN

 ②连接查询也是SIMPLE

explain select * from s1 inner join s2;

分析查询语句:EXPLAIN

 ③对于包含UNION、UNION ALL的大查询来说,它是由几个小查询组成的,其中最左边的查询的select_type值就是PRIMARY,其余的小查询的select_type值为UNION

④MySQL选择使用临时表来完成UNION查询的去重工作,针对该临时表的查询的select_type的值是UNION RESULT

 UNION 具有去重操作,UNION ALL没有去重操作,所以UNION会有一个临时表

分析查询语句:EXPLAIN

 ⑤如果包含子查询的查询语句不能转化为多表联查的形式,并且该子查询不是相关子查询,该子查询的第一个select关键字的查询的select_type就是SUBQUERY

⑥如果包含子查询的查询语句不能转化为多表联查的形式,并且该子查询是相关子查询,该子查询的第一个select关键字的查询的select_type就是DEPENDENT SUBQUERY

分析查询语句:EXPLAIN

⑦在包含`UNION`或者`UNION ALL`的大查询中,如果各个小查询都依赖于外层查询的话,那除了最左边的那个小查询之外,其余的小查询的`select type `的值就是`DEPENDENT UNION

分析查询语句:EXPLAIN

 ⑧对于包含派生表的查询,该派生表对应的子查询的select_type就是DERIVED

分析查询语句:EXPLAIN

 ⑨当查询优化器在执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询时,该子查询对应的`select type`属性就是‘MATERIALIZED~

分析查询语句:EXPLAIN

 4、type

执行计划的一条记录就代表着MySQL对某个表的执行查询时的访问方法,又称°访问类型”,其中的type列就表明了这个访问方法是啥,是较为重要的一个指标。比如,看到type列的值是ref,表明MysQL即将使用ref访问方法来执行对s1表的查询。

完整的访问方法如下: system,const,eq_ref,ref, fulltext,ref_or_null , index_merge ,unique_subquery , index_subquery , range , index,ALL。

①system

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

②const

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

explain select * from s1 where id = 10005;
explain select * from s1 where key2 = 10066;

 

分析查询语句:EXPLAIN

 ③eq_ref

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

explain select * from s1 inner join s2 on s1.id = s2.id;

分析查询语句:EXPLAIN

 ④ref

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

explain select * from s1 where key1 = 'a';

分析查询语句:EXPLAIN

 ⑤unique_subquery

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

分析查询语句:EXPLAIN

 ⑥如果使用索引获取某些范围区间的记录,那么就可能用到range访问方法

分析查询语句:EXPLAIN

 ⑦index

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

分析查询语句:EXPLAIN

 ⑧all:全表扫描

分析查询语句:EXPLAIN

 5、possiable_keys和key

possiable_keys列表示在某个查询语句中,对某个表执行单表查询时可能用到的索引有哪些。

key表示实际用到的索引有哪些

6、key_len

实际使用到的索引的长度(字节数),检查是否充分利用了索引,值越大越好(和自己比),主要针对联合索引。

分析查询语句:EXPLAIN

 7、ref

当使用索引列等值查询时,与索引列进行等值匹配的对象信息,可以是一个常数或一个列

分析查询语句:EXPLAIN

 8、rows

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

分析查询语句:EXPLAIN

 9、filtered:某个表经过搜索条件过滤后剩余记录条数的百分比

如果使用的是索引执行的单表扫描,那么计算时需要估计出满足除使用到对应索引的搜索条件外的其他搜索条件的记录有多少条。

分析查询语句:EXPLAIN对于单表查询来说,这个filtered列的值没什么意义,我们更关注在连接查询中驱动表对应的执行计划记录的filtered值*,它决定了被驱动表要执行的次数(即: rows * filtered)

分析查询语句:EXPLAIN

 10、extra:一些额外的信息,更准确的理解MySQL到底将如何执行SQL语句

①当没有from table时会提示额外信息

分析查询语句:EXPLAIN

 ②当where子句恒等false时候会提示额外信息

分析查询语句:EXPLAIN

 ③使用全表扫描或索引来执行对某个表的查询,并且where子句中有针对该表的搜索条件时,会提示额外信息

分析查询语句:EXPLAIN

 当查询列表处有MIN、MAX等聚合函数,不论有没有符合搜索条件时,将会提示额外信息

分析查询语句:EXPLAIN

 

 

先更新到这里,会持续更新~~~~文章来源地址https://www.toymoban.com/news/detail-425139.html

到了这里,关于分析查询语句:EXPLAIN的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • EXPLAIN概述与字段剖析

    定位了查询慢的sQL之后,我们就可以使用EXPLAIN或DESCRIBE 工具做针对性的分析查询语句。 DESCRIBE语句的使用方法与EXPLAIN语句是一样的,并且分析结果也是一样的。 MySQL中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的

    2024年02月10日
    浏览(17)
  • 数据分析法宝,一个 SQL 语句查询多个异构数据源

    随着企业数据量呈现出爆炸式增长,跨部门、跨应用、跨平台的数据交互需求越来越频繁,传统的数据查询方式已经难以满足这些需求。同时,不同数据库系统之间的数据格式、查询语言等都存在差异,直接进行跨库查询十分困难。 虽然 MySQL、Oracle、PostgreSQL 等数据库系统都

    2024年02月05日
    浏览(54)
  • Mysql 学习(十 二)查询优化 Explain

    一条查询语句经过Mysql查询优化器的各种基于成本和规则的优化后生成一个所谓的执行计划,而Explain 语句可以让我们知道执行计划的语法,从而我们有针对性的提升性能 举例子: EXPLAIN SELECT 1 由此我们得到了一些参数,而这些参数我们可以知道我们这个执行计划做了那些优

    2024年02月05日
    浏览(39)
  • openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态

    195.1 分析查询语句运行状态 195.1.1 问题现象 系统中部分查询语句运行时间过长,需要分析查询语句的运行状态。 195.1.2 处理办法 以操作系统用户omm登录主机。 使用如下命令连接数据库。 postgres为需要连接的数据库名称,8000为端口号。 设置参数track_activities为on。 当此参数为

    2024年01月15日
    浏览(59)
  • TP6 使用闭合语句查询多个or的模型语句

    需要传入参数查询的,可以参照下面的:         查询出学校名称和昵称中有中学的所有学校

    2024年02月11日
    浏览(51)
  • SQL语句 - 多表查询使用详细介绍

    例如我们有一张员工表和部门表, 员工表有6条数据, 部门表表有4条数据 : 使用多表查询, 查询员工表和部门表两张表 : 此时查询到的结果会有24条数据, 为什么会这样呢 ? 笛卡尔积:有A, B两个集合, 取A, B集合所有组合情况(4*6=24); 我们多表查询, 更多的是消除这些无效的数据 例

    2024年01月16日
    浏览(50)
  • java直接使用dsl语句查询ES

    2024年02月03日
    浏览(43)
  • MySQL Explain分析

    使用EXPLAIN可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain ,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息, 而不是执行这条SQL 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临

    2024年02月11日
    浏览(84)
  • Mongo执行计划explain分析

    3.0+的explain有三种模式,分别是:queryPlanner、executionStats、allPlansExecution。现实开发中,常用的是 executionStats模式 。 在查询语句后面加上explain(\\\"executionStats\\\")   第一层:executionTimeMillis  最为直观explain返回值是 executionTimeMillis值 ,指的是我们 这条语句的执行时间 ,这个值当然

    2024年02月04日
    浏览(59)
  • 【Mysql】Explain深入分析(三)

    Explain工具介绍 使用EXPLAIN可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain ,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL 注意:如果 from 中包含子查询,仍会执行该子查询,

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包