Mysql执行计划-看这一篇就够了

目录

1. 概述

2. 执行计划使用

2.1.执行计划详解

2.1.1. 执行计划-ID

 2.1.2.执行计划select_type

2.1.3.执行计划-table

2.1.4.执行计划-type

 2.1.5.执行计划possible_key和key

2.1.6.执行计划key_len

2.1.7.执行计划ref

2.1.8.执行计划rows

2.1.9.执行计划Extra


1. 概述

在平时的开发工作中,少不了数据库的使用,那么就会涉及到sql语句,如何知道sql语句执行的过程,以及sql语句执行的性能,通过执行计划模拟优化器执行sql进行分析

2. 执行计划使用

语法:EXPLAIN/DESC + SQL语句

例如:explain select * from user;

执行计划输出内容:

EXPLAIN SELECT * FROM test_tb1;

执行计划id、查询类型、查询表、分区,索引使用情况、表之间的引用等

2.1.执行计划详解

2.1.1. 执行计划-ID

select查询序列号,如果id相同,则从上到下顺序执行,如果不相同,序列号大的优先级比较高,先执行

ID相同:

EXPLAIN SELECT * FROM t1,t2,t3 WHERE t1.`id`=t2.`t1_id` AND t2.`id`=t3.`t2_id`;

 ID不同:

EXPLAIN SELECT t1.* FROM t1 WHERE t1.`id`=
    (SELECT t2.`t1_id` FROM t2 WHERE t2.`id`=
         (SELECT t3.`t2_id` FROM t3 WHERE t3.`id`=1));

 2.1.2.执行计划select_type

查询类型主要用来说明查询的类型:普通查询、联合查询、子查询等

序号select_type说明
1SIMPLE简单的查询,查询中不饱和子查询或者Union
2PRIMARY查询中包含任何复杂的子查询,最外层的查询类型为PRIMARY
3SUBQUERYSELECT或者where中包含子查询
4DERIVED在from中包含子查询被标记为DERIVED(衍生),Mysql会递归查询这些子查询,将查询结果放入临时表
5UNION第二个select中查询UNION,则被标记为UNION,如果UNION出现在from子查询中,最外层被标记为DERIVED
6       UNION RESULT从UNION表获取结果的select

SIMPLE举例:

sql语句:EXPLAIN SELECT * FROM t1;

PRIMARY、SUBQUERY举例:

sql语句: EXPLAIN SELECT id,(SELECT NAME FROM t2 WHERE t2.`id`=1) FROM t1;

2.1.3.执行计划-table

表示查询数据所在的表

2.1.4.执行计划-type

type代表访问类型,是判断sql执行性能比较关键的一个字段,性能从高到低依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

system:表示只有一条数据,类似于系统表,是const的一种特例

const:表示通过索引一次就查询到数据,比较块,用于primary key(主键)和unique唯一索引

eq_ref:用于“=”运算符比较的索引列

EXPLAIN SELECT * FROM t1,t2 WHERE t1.id = t2.id;

ref:非唯一索引扫描 

rang:检索给的范围的值,使用一个索引进行选择,where后面使用between、>、<、in等

EXPLAIN SELECT * FROM t1 WHERE id > 0;

 index:当前查询的结果全部为索引列,虽然也是全部扫描,但是只查询索引数据,没有之间查询数据

EXPLAIN SELECT id FROM t1 WHERE id > 0;

all:遍历全部查询

EXPLAIN SELECT * FROM t1;

 2.1.5.执行计划possible_key和key

possible_key:可能使用的索引

key:实际使用的索引,如果为null,表示没有用到索引

2.1.6.执行计划key_len

表示索引中使用的字节数,可以根据这个字段计算查询中索引使用的长度,长度越短越好。

2.1.7.执行计划ref

表示索引的哪一列被使用

根据ref可以看出test库的t1表的id索引被使用

2.1.8.执行计划rows

根据表统计信息和索引选用情况,大致计算出查询到所需数据需要查询的行数

2.1.9.执行计划Extra

using where:表示使用了where过滤

using index:表示使用了覆盖索引,避免使用表数据

using join buffer:表示使用了链接缓存

MySQL执行计划可以使用EXPLAIN命令来查看。通过返回的信息,可以了解MySQL优化器是如何执行SQL语句的,从而帮助我们提供优化的思路。EXPLAIN命令主要用于查看SQL语句的执行计划,它可以模拟优化器执行SQL查询语句,提供以下信息来帮助我们优化SQL: - 数据读取操作的操作类型 - 表的读取顺序 - 哪些索引可以使用 - 哪些索引被实际使用 - 表之间的引用关系 - 每张表有多少行被优化器查询 使用EXPLAIN命令可以帮助我们分析SQL语句的执行计划,从而找出慢查询的原因,并进行相应的优化。在执行计划中,若出现了"using temporary"的提示,表示使用了临时表存储中间结果。临时表可以是内存临时表和磁盘临时表,需要查看status变量中的used_tmp_table和used_tmp_disk_table才能具体确定是使用了哪种类型的临时表。常见的情况是在包含order by和分组查询group by的语句中,会使用临时表来进行排序和分组操作。对于group by语句,需要遵循所建索引的顺序与个数,以达到更好的性能表现。因此,通过查看执行计划中的相关信息,可以帮助我们快速优化SQL语句。123 #### 引用[.reference_title] - *1* *2* *3* [10 分钟教会你如何看懂 MySQL 执行计划](https://blog.csdn.net/m0_71777195/article/details/127441855)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿小木的愤怒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值