公司网站建设费用的会计分录,营销型网站建设目的,知晓小程序商店,一条龙网站建设哪家专业文章目录 0 环境准备1 explain 之 id2 explain 之 select_type3 explain 之 table4 explain 之 type5 explain 之 key6 explain 之 rows7 explain 之 extra MySQL 的 EXPLAIN 是一个用于查询优化的关键字。它用于分析和评估查询语句的执行计划#xff0c;帮助开发者理解查询语… 文章目录 0 环境准备1 explain 之 id2 explain 之 select_type3 explain 之 table4 explain 之 type5 explain 之 key6 explain 之 rows7 explain 之 extra MySQL 的 EXPLAIN 是一个用于查询优化的关键字。它用于分析和评估查询语句的执行计划帮助开发者理解查询语句的性能问题以及优化查询的方式。
使用EXPLAIN关键字可以获取关于查询执行计划的详细信息包括表的访问顺序、连接方式、索引使用情况等这些信息能够帮助你确定查询是否有效利用了索引以及是否存在潜在的性能瓶颈。
要使用EXPLAIN关键字只需在查询语句前加上EXPLAIN关键字即可例如
EXPLAIN SELECT * FROM table_name WHERE column_name value;执行以上语句后MySQL会返回一个结果集包含了查询执行计划的详细信息。该结果集中的每一行对应查询执行计划中的一步操作你可以通过分析这些数据来确定查询的性能瓶颈以及优化的方向。
这些信息包括以下列
id: 查询执行计划中每个操作的唯一标识
select_type: 操作类型如简单查询、联合查询等
table: 操作涉及的表名
type: 表访问的方式如全表扫描、索引扫描等
possible_keys: 可能使用的索引
key: 实际使用的索引
key_len: 实际使用的索引长度
ref: 与索引比较的列或常量值
rows: 预估的结果集行数
Extra: 额外的信息如排序、临时表等。
通过分析这些信息你可以更好地理解查询的执行过程并且采取相应的优化措施例如创建合适的索引、优化查询语句等以提高MySQL查询的性能。0 环境准备
CREATE TABLE t_role (
id varchar(32) NOT NULL,
role_name varchar(255) DEFAULT NULL,
role_code varchar(255) DEFAULT NULL,
description varchar(255) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY unique_role_name (role_name)
) ENGINEInnoDB DEFAULT CHARSETutf8;CREATE TABLE t_user (
id varchar(32) NOT NULL,
username varchar(45) NOT NULL,
password varchar(96) NOT NULL,
name varchar(45) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY unique_user_username (username)
) ENGINEInnoDB DEFAULT CHARSETutf8;CREATE TABLE user_role (
id int(11) NOT NULL auto_increment ,
user_id varchar(32) DEFAULT NULL,
role_id varchar(32) DEFAULT NULL,
PRIMARY KEY (id),
KEY fk_ur_user_id (user_id),
KEY fk_ur_role_id (role_id),
CONSTRAINT fk_ur_role_id FOREIGN KEY (role_id) REFERENCES t_role (id) ON
DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT fk_ur_user_id FOREIGN KEY (user_id) REFERENCES t_user (id) ON
DELETE NO ACTION ON UPDATE NO ACTION
) ENGINEInnoDB DEFAULT CHARSETutf8;insert into t_user (id, username, password, name)
values(1,super,$2a$10$TJ4TmCdK.X4wv/tCqHW14.w70U3CC33CeVncD3SLmyMXMknstqKRe,
超级管理员);
insert into t_user (id, username, password, name)
values(2,admin,$2a$10$TJ4TmCdK.X4wv/tCqHW14.w70U3CC33CeVncD3SLmyMXMknstqKRe,
系统管理员);
insert into t_user (id, username, password, name)
values(3,itcast,$2a$10$8qmaHgUFUAmPR5pOuWhYWOr291WJYjHelUlYn07k5ELF8ZCrW0Cui,
test02);
insert into t_user (id, username, password, name)
values(4,stu1,$2a$10$pLtt2KDAFpwTWLjNsmTEi.oU1yOZyIn9XkziK/y/spH5rftCpUMZa,学
生1);
insert into t_user (id, username, password, name)
values(5,stu2,$2a$10$nxPKkYSez7uz2YQYUnwhR.z57km3yqKn3Hr/p1FR6ZKgc18u.Tvqm,学
生2);
insert into t_user (id, username, password, name)
values(6,t1,$2a$10$TJ4TmCdK.X4wv/tCqHW14.w70U3CC33CeVncD3SLmyMXMknstqKRe,老师
1);
INSERT INTO t_role (id, role_name, role_code, description) VALUES(5,学
生,student,学生);
INSERT INTO t_role (id, role_name, role_code, description) VALUES(7,老
师,teacher,老师);
INSERT INTO t_role (id, role_name, role_code, description) VALUES(8,教
学管理员,teachmanager,教学管理员);
INSERT INTO t_role (id, role_name, role_code, description) VALUES(9,管
理员,admin,管理员);
INSERT INTO t_role (id, role_name, role_code, description) VALUES(10,超
级管理员,super,超级管理员);
INSERT INTO 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 相同表示加载表的顺序是从上到下。
explain select * 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值越大优先级越高越先被执行。
EXPLAIN SELECT * 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
其他的额外的执行计划信息在该列展示 。