千家信息网

MySql学习笔记(五):explain-数据读取操作的操作类型

发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,explain命令如下:mysql> explain select * from t_blog;+----+-------------+--------+------+---------------+
千家信息网最后更新 2025年11月11日MySql学习笔记(五):explain-数据读取操作的操作类型

explain命令如下:

mysql> explain select * from t_blog;+----+-------------+--------+------+---------------+------+---------+------+------+-------+| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra |+----+-------------+--------+------+---------------+------+---------+------+------+-------+|  1 | SIMPLE      | t_blog | ALL  | NULL          | NULL | NULL    | NULL |    7 |       |+----+-------------+--------+------+---------------+------+---------+------+------+-------+1 row in set

其中select_type列指明该条SQL的读取操作的操作类型。

select_type共有六种类型:simple、primmy、subQuery、derived、union、union result。

1、simple

表示该条sql是简单的select,不包含任何子查询和union,例:

mysql> explain select * from t_blog;+----+-------------+--------+------+---------------+------+---------+------+------+-------+| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra |+----+-------------+--------+------+---------------+------+---------+------+------+-------+|  1 | SIMPLE      | t_blog | ALL  | NULL          | NULL | NULL    | NULL |    7 |       |+----+-------------+--------+------+---------------+------+---------+------+------+-------+1 row in set

2、primmy

查询中如果包含了任何一个子查询,最外层的查询就会被标记为primmy,例:

mysql> explain select * from t_blog where id = (select id from t_type where name = "JAVA");+----+-------------+--------+-------+---------------+---------+---------+-------+------+-------------+| id | select_type | table  | type  | possible_keys | key     | key_len | ref   | rows | Extra       |+----+-------------+--------+-------+---------------+---------+---------+-------+------+-------------+|  1 | PRIMARY     | t_blog | const | PRIMARY       | PRIMARY | 4       | const |    1 |             ||  2 | SUBQUERY    | t_type | ALL   | NULL          | NULL    | NULL    | NULL  |    4 | Using where |+----+-------------+--------+-------+---------------+---------+---------+-------+------+-------------+2 rows in set

这条sql一共读取了两张表,t_type作为子查询被加载,t_blog作为最外部的读取操作,被标记为 PRIMMY。

3、subquery

查询中,在select或where自居中包含了子查询,该子查询就会被标记为subquery,如上例的t_type

4、derived

在from里列表中包含了子查询,该子查询会被标记为derived(衍生),例:

mysql> explain select * from t_blog inner join (select id from t_type) a on t_blog.typeId = a.id;+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+| id | select_type | table      | type  | possible_keys | key     | key_len | ref  | rows | Extra       |+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+|  1 | PRIMARY     |  | ALL   | NULL          | NULL    | NULL    | NULL |    4 |             ||  1 | PRIMARY     | t_blog     | ALL   | NULL          | NULL    | NULL    | NULL |    7 | Using where ||  2 | DERIVED     | t_type     | index | NULL          | PRIMARY | 4       | NULL |    4 | Using index |+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+3 rows in set

t_type表读取时,出现在from语句中,因此被标记为derived。mysql会先将from语句的子查询的查询结果放到一张临时表中,然后再将最终的结果返回,所以,是很耗费内存的一种操作。值得注意的是,在第一行的table列出现了字样,表示该表是个衍生虚表,他的来源根据后面的数字"2"来寻找,这个"2"就是第一列的id,表示是id为2的衍生表的衍生虚表。

5、union

若sql中包含了union,第二个select会被标记为union

mysql> explain select * from t_blog b left join t_type t on b.typeId = t.id    union    select * from t_blog b1 right join t_type t1 on b1.typeId = t1.id;+------+--------------+------------+--------+---------------+---------+---------+---------------+------+-------+| id   | select_type  | table      | type   | possible_keys | key     | key_len | ref           | rows | Extra |+------+--------------+------------+--------+---------------+---------+---------+---------------+------+-------+|    1 | PRIMARY      | b          | ALL    | NULL          | NULL    | NULL    | NULL          |    7 |       ||    1 | PRIMARY      | t          | eq_ref | PRIMARY       | PRIMARY | 4       | blog.b.typeId |    1 |       ||    2 | UNION        | t1         | ALL    | NULL          | NULL    | NULL    | NULL          |    4 |       ||    2 | UNION        | b1         | ALL    | NULL          | NULL    | NULL    | NULL          |    7 |       || NULL | UNION RESULT |  | ALL    | NULL          | NULL    | NULL    | NULL          | NULL |       |+------+--------------+------------+--------+---------------+---------+---------+---------------+------+-------+5 rows in set

t1表和t2表都出现在union后的select,因此都被标及为union

6、union result

表示该查询是从union表中获取结果的select,是union的结果集,如上例,上条select就是获取的union的结果集

查询 标记 结果 衍生 类型 如上 就是 语句 中包 一行 个子 内存 命令 外层 字样 数字 来源 先将 数据 笔记 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全法》的突出亮点在 女大学生软件开发 上海预付费软件开发 江苏pdu服务器电源制造商 梦幻西游口袋版三个服务器副本 党员对网络安全的看法 我国网络安全问题的论文 rosetta2安装数据库 app手机软件开发的价位 非居民企业在境外完成软件开发 计算机网络技术教学进度表 安徽交通软件开发定制公司 数据库实际收入怎么算 宁海直销软件开发外包 网络安全的功能和措施 北京拉手网络技术有限公司赤峰 互动展示软件开发 自适应软件开发asd框架 武装突袭服务器说不了话 互联网是科技发展中的一部分吗 ns暗黑重制版服务器上不去 支付宝领劵连接服务器超时 java 连接外网数据库 csol为什么总是服务器中断 如何复制房友的数据库 内网访问服务器数据库速度慢 监控数据库都有什么工具 银行软件开发中心级别 榆树通用网络技术咨询诚信经营 推单算法是服务器还是手机端
0