0


MySQL explain详解

文章目录

在这里插入图片描述

MySQL 的 EXPLAIN 是一个用于查询优化的关键字。它用于分析和评估查询语句的执行计划,帮助开发者理解查询语句的性能问题以及优化查询的方式。

使用EXPLAIN关键字,可以获取关于查询执行计划的详细信息,包括表的访问顺序、连接方式、索引使用情况等,这些信息能够帮助你确定查询是否有效利用了索引,以及是否存在潜在的性能瓶颈。

要使用EXPLAIN关键字,只需在查询语句前加上"EXPLAIN"关键字即可,例如:

EXPLAINSELECT*FROM table_name WHERE column_name ='value';

执行以上语句后,MySQL会返回一个结果集,包含了查询执行计划的详细信息。该结果集中的每一行对应查询执行计划中的一步操作,你可以通过分析这些数据来确定查询的性能瓶颈以及优化的方向。

这些信息包括以下列:

id: 查询执行计划中每个操作的唯一标识,
select_type: 操作类型,如简单查询、联合查询等,
table: 操作涉及的表名,
type: 表访问的方式,如全表扫描、索引扫描等,
possible_keys: 可能使用的索引,
key: 实际使用的索引,
key_len: 实际使用的索引长度,
ref: 与索引比较的列或常量值,
rows: 预估的结果集行数,
Extra: 额外的信息,如排序、临时表等。
通过分析这些信息,你可以更好地理解查询的执行过程,并且采取相应的优化措施,例如创建合适的索引、优化查询语句等,以提高MySQL查询的性能。

0 环境准备

CREATETABLE`t_role`(`id`varchar(32)NOTNULL,`role_name`varchar(255)DEFAULTNULL,`role_code`varchar(255)DEFAULTNULL,`description`varchar(255)DEFAULTNULL,PRIMARYKEY(`id`),UNIQUEKEY`unique_role_name`(`role_name`))ENGINE=InnoDBDEFAULTCHARSET=utf8;CREATETABLE`t_user`(`id`varchar(32)NOTNULL,`username`varchar(45)NOTNULL,`password`varchar(96)NOTNULL,`name`varchar(45)NOTNULL,PRIMARYKEY(`id`),UNIQUEKEY`unique_user_username`(`username`))ENGINE=InnoDBDEFAULTCHARSET=utf8;CREATETABLE`user_role`(`id`int(11)NOTNULLauto_increment,`user_id`varchar(32)DEFAULTNULL,`role_id`varchar(32)DEFAULTNULL,PRIMARYKEY(`id`),KEY`fk_ur_user_id`(`user_id`),KEY`fk_ur_role_id`(`role_id`),CONSTRAINT`fk_ur_role_id`FOREIGNKEY(`role_id`)REFERENCES`t_role`(`id`)ONDELETENOACTIONONUPDATENOACTION,CONSTRAINT`fk_ur_user_id`FOREIGNKEY(`user_id`)REFERENCES`t_user`(`id`)ONDELETENOACTIONONUPDATENOACTION)ENGINE=InnoDBDEFAULTCHARSET=utf8;insertinto`t_user`(`id`,`username`,`password`,`name`)values('1','super','$2a$10$TJ4TmCdK.X4wv/tCqHW14.w70U3CC33CeVncD3SLmyMXMknstqKRe','
超级管理员');insertinto`t_user`(`id`,`username`,`password`,`name`)values('2','admin','$2a$10$TJ4TmCdK.X4wv/tCqHW14.w70U3CC33CeVncD3SLmyMXMknstqKRe','
系统管理员');insertinto`t_user`(`id`,`username`,`password`,`name`)values('3','itcast','$2a$10$8qmaHgUFUAmPR5pOuWhYWOr291WJYjHelUlYn07k5ELF8ZCrW0Cui','test02');insertinto`t_user`(`id`,`username`,`password`,`name`)values('4','stu1','$2a$10$pLtt2KDAFpwTWLjNsmTEi.oU1yOZyIn9XkziK/y/spH5rftCpUMZa','学
生1');insertinto`t_user`(`id`,`username`,`password`,`name`)values('5','stu2','$2a$10$nxPKkYSez7uz2YQYUnwhR.z57km3yqKn3Hr/p1FR6ZKgc18u.Tvqm','学
生2');insertinto`t_user`(`id`,`username`,`password`,`name`)values('6','t1','$2a$10$TJ4TmCdK.X4wv/tCqHW14.w70U3CC33CeVncD3SLmyMXMknstqKRe','老师
1');INSERTINTO`t_role`(`id`,`role_name`,`role_code`,`description`)VALUES('5','学
生','student','学生');INSERTINTO`t_role`(`id`,`role_name`,`role_code`,`description`)VALUES('7','老
师','teacher','老师');INSERTINTO`t_role`(`id`,`role_name`,`role_code`,`description`)VALUES('8','教
学管理员','teachmanager','教学管理员');INSERTINTO`t_role`(`id`,`role_name`,`role_code`,`description`)VALUES('9','管
理员','admin','管理员');INSERTINTO`t_role`(`id`,`role_name`,`role_code`,`description`)VALUES('10','超
级管理员','super','超级管理员');INSERTINTO user_role(id,user_id,role_id)VALUES(NULL,'1','5'),(NULL,'1','7'),(NULL,'2','8'),(NULL,'3','9'),(NULL,'4','8'),(NULL,'5','10');

1 explain 之 id

id 字段是 select查询的序列号,是一组数字,表示的是查询中执行select子句或者是操作表的顺序。id 情况有三种:

1) id 相同表示加载表的顺序是从上到下。

explainselect*from t_role r, t_user u, user_role ur where r.id = ur.role_id and
u.id = ur.user_id ;

在这里插入图片描述

2) id 不同id值越大,优先级越高,越先被执行。

EXPLAINSELECT*FROM t_role WHERE id =(SELECT role_id FROM user_role WHERE user_id
=(SELECT id FROM t_user WHERE username ='stu1'))

在这里插入图片描述

3) id 有相同,也有不同,同时存在。id相同的可以认为是一组,从上往下顺序执行;在所有的组中,id的值越大,优先级越高,越先执行。

2 explain 之 select_type

表示 SELECT 的类型,常见的取值,如下表所示:
select_type含义SIMPLE简单的select查询,查询中不包含子查询或者UNIONPRIMARY查询中若包含任何复杂的子查询,最外层查询标记为该标识SUBQUERY在SELECT 或 WHERE 列表中包含了子查询DERIVED在FROM 列表中包含的子查询,被标记为 DERIVED(衍生) MYSQL会递归执行这些子查询,把结果放在临时表中UNION若第二个SELECT出现在UNION之后,则标记为UNION ; 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为 : DERIVEDUNION RESULT从UNION表获取结果的SELECT

3 explain 之 table

展示这一行的数据是关于哪一张表的

4 explain 之 type

type 显示的是访问类型,是较为重要的一个指标,可取值为:
select_type含义NULLMySQL不访问任何表,索引,直接返回结果system表只有一行记录(等于系统表),这是const类型的特例,一般不会出现const表示通过索引一次就找到了,const 用于比较primary key 或者 unique 索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL 就能将该查询转换为一个常亮。const于将"主键" 或 “唯一” 索引的所有部分与常量值进行比较eq_ref类似ref,区别在于使用的是唯一索引,使用主键的关联查询,关联查询出的记录只有一条。常见于主键或唯一索引扫描ref非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,返回所有匹配某个单独值的所有行(多个)range只检索给定返回的行,使用一个索引来选择行。 where 之后出现 between , < , > , in 等操作。indexindex 与 ALL的区别为 index 类型只是遍历了索引树, 通常比ALL 快, ALL 是遍历数据文件。all将遍历全表以找到匹配的行
结果值从最好到最坏以此是:null > system > const > eq_ref > ref > range > index > ALL

一般来说, 我们需要保证查询至少达到 range 级别, 最好达到ref 。

5 explain 之 key

possible_keys : 显示可能应用在这张表的索引, 一个或多个。

key : 实际使用的索引, 如果为NULL, 则没有使用索引。

key_len : 表示索引中使用的字节数, 该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下, 长度越短越好 。

在这里插入图片描述

6 explain 之 rows

扫描行的数量。

7 explain 之 extra

其他的额外的执行计划信息,在该列展示 。
在这里插入图片描述

在这里插入图片描述

标签: mysql 数据库

本文转载自: https://blog.csdn.net/m0_60915009/article/details/131854489
版权归原作者 我有一颗五叶草 所有, 如有侵权,请联系我们删除。

“MySQL explain详解”的评论:

还没有评论