MySQL_Explain详解
MYSQL_01Explain详解与索引实践 思维导图模板_ProcessOn思维导图、流程图
https://www.processon.com/view/629d5405e0b34d3bc3b28f04

DROP TABLE IF EXISTS `departments`;
CREATE TABLE `departments` (
`id` int(0) NOT NULL,
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of departments
-- ----------------------------
INSERT INTO `departments` VALUES (1, 'Human Resources');
INSERT INTO `departments` VALUES (2, 'Marketing');
INSERT INTO `departments` VALUES (3, 'Finance');
DROP TABLE IF EXISTS `departments_employees`;
CREATE TABLE `departments_employees` (
`id` int(0) NOT NULL,
`d_id` int(0) NOT NULL,
`e_id` int(0) NOT NULL,
`remark` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`num` int(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_d_e_id`(`d_id`, `e_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of departments_employees
-- ----------------------------
INSERT INTO `departments_employees` VALUES (1, 1, 1, NULL, NULL);
INSERT INTO `departments_employees` VALUES (2, 1, 2, NULL, NULL);
INSERT INTO `departments_employees` VALUES (3, 2, 1, NULL, NULL);
DROP TABLE IF EXISTS `employees`;
CREATE TABLE `employees` (
`id` int(0) NOT NULL,
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`salary` decimal(10, 2) NULL DEFAULT NULL,
`department_id` int(0) NULL DEFAULT NULL,
`nums` bigint(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `department_id`(`department_id`) USING BTREE,
INDEX `salary`(`salary`) USING BTREE,
INDEX `name_sal_did`(`name`, `salary`, `department_id`) USING BTREE,
INDEX `name_did`(`name`, `department_id`) USING BTREE,
CONSTRAINT `employees_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `departments` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of employees
-- ----------------------------
INSERT INTO `employees` VALUES (1, 'Alice', 70000.00, 1, NULL);
INSERT INTO `employees` VALUES (2, 'Bob', 80000.00, 1, NULL);
INSERT INTO `employees` VALUES (3, 'Charlie', 90000.00, 2, NULL);
INSERT INTO `employees` VALUES (4, 'Dave', 100000.00, 2, NULL);
INSERT INTO `employees` VALUES (5, 'Eve', 110000.00, 3, NULL);
INSERT INTO `employees` VALUES (6, 'Frank', 120000.00, 3, NULL);
Explain的各个列详解析
id:select查询的标识符,表示查询的顺序。
EXPLAIN SELECT * FROM EMPLOYEES E1 JOIN DEPARTMENTS E2 ON E1.DEPARTMENT_ID = E2.ID ;
select_type:用于标识查询中的SELECT语句的类型,
MySQL的查询优化器有一个特性叫做派生表合并(Derived Table Merge),这个特性在MySQL 5.7及以上版本默认是开启的。
开启这个特性后,MySQL查询优化器会尝试将派生表(即子查询生成的临时表)合并到主查询中,以便能够更高效地处理查询。
如果你想在EXPLAIN的输出中看到派生表,你可以通过设置会话变量optimizer_switch来关闭派生表合并特性,
SET SESSION optimizer_switch='derived_merge=off';
EXPLAIN SELECT NAME FROM EMPLOYEES WHERE SALARY > 80000;
EXPLAIN SELECT D.NAME FROM DEPARTMENTS D WHERE D.ID IN (SELECT DEPARTMENT_ID FROM EMPLOYEES WHERE SALARY > 80000);
按理来说,在这个查询中,外部的查询是PRIMARY。在这种情况下,MySQL 会执行一个称为 "子查询关联" 的优化。对于 IN 子查询,MySQL 会尝试重写它们为 INNER JOIN, 如果可以重写,MySQL 就会优化执行计划。所以才看到两个 SELECT 都被标记为 SIMPLE 的原因。MySQL 实际上将子查询转换成了一个简单的 JOIN 查询。 但是请注意,这并不是所有情况下都会发生。这取决于查询优化器如何判断可以获得最好的性能。 有时,为了禁止子查询优化,可以使用 STRAIGHT_JOIN 来强制 MySQL 按照你指定的 JOIN 顺序执行查询,在大多数情况下,MySQL的查询优化器可以找出最优的执行顺序。 所以,我们应该谨慎使用STRAIGHT_JOIN关键字,只有在确定默认的执行顺序不理想时,才应该考虑使用它。
EXPLAIN SELECT d.name FROM departments d WHERE d.id IN (SELECT department_id FROM employees WHERE salary > 80000);
在这个查询中,内部的查询就被标记为SUBQUERY。
EXPLAIN SELECT name FROM employees WHERE department_id = (SELECT id FROM departments WHERE name = 'Human Resources') UNION SELECT name FROM employees WHERE salary > 80000;

EXPLAIN SELECT * FROM (SELECT name FROM employees WHERE department_id = (SELECT id FROM departments WHERE name = 'Human Resources') UNION SELECT name FROM employees WHERE salary > 80000) AS unioned;

EXPLAIN SELECT * FROM (SELECT id FROM departments WHERE name = 'Human Resources') AS derived_table;
在这个查询中,子查询就会被标记为DERIVED。MySQL会首先执行这个子查询,然后将结果存储在一个临时表中,这个临时表就叫做"derived_table"。

table:输出结果集的表。
type:连接类型,常见的有:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,类型从左至右,性能从高到低。







possible_keys:表示可能应用在这张表中的索引。如果为空,表示没有可能的索引。
key:实际使用的索引。如果为NULL,则没有使用索引。
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好。
字符串类型(CHAR, VARCHAR):
数值类型:对于数值类型,
时间类型:
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。
rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需读取的行数。
filtered 列该列是一个百分比的值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表)。
Extra:包含MySQL解决查询的详细信息,如:Using where(表示mysql服务器将在存储引擎检索行后再进行过滤),Using temporary(表示MySQL需要使用临时表来存储结果集),Using filesort(表示MySQL会对结果使用一个外部的索引排序,而不是按照表内的索引顺序来读取)等。






看到这里如果您觉得我的文章学的不错,请关注我的公众号,微信搜索 “二二零二”,更多内容正在创作者
MySQL_Explain详解的更多相关文章
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
- .NET应用和AEAI CAS集成详解
1 概述 数通畅联某综合SOA集成项目的统一身份认证工作,需要第三方系统配合进行单点登录的配置改造,在项目中有需要进行单点登录配置的.NET应用系统,本文专门记录.NET应用和AEAI CAS的集成过 ...
随机推荐
- Java 网络编程 —— Socket 详解
构造 Socket 在[客户端/服务端]的通信模式中,客户端需要主动构造与服务器连接的 Socket,构造方法有以下几种重载形式: Socket() Socket(InetAddress addres ...
- [ZJOI2020] 序列 线性规划做法/贪心做法
线性规划做法 同时也作为线性规划对偶的一个小小的学习笔记. 以下 \(\cdot\) 表示点积,\(b,c,x,y\) 是行向量. \(A\) 是矩阵,对于向量 \(u,v\) 若 \(\forall ...
- 【Visual Leak Detector】在 VS 高版本中使用 VLD
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记. 本篇介绍如何在 VS 高版本中使用 vld2.5.1.同系列文章目录可见 <内存泄漏检测工具>目录 目录 说明 1. 使用前 ...
- Vue3 +element-plus+ wangEditor 富文本编辑器+前端七牛云上传
我用的vue3,element-plus ,没用ts 搭建wangEditor 参考 地址 https://www.cnblogs.com/xbxxf/p/16791084.html 七牛云安装参考地 ...
- Pwn系列之Protostar靶场 Stack6题解
源码如下: #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <stri ...
- 2022-10-28:以下go语言代码输出什么?A:false false;B:true false;C:true true;D:false true。 package main import “f
2022-10-28:以下go语言代码输出什么?A:false false:B:true false:C:true true:D:false true. package main import &qu ...
- 2021-05-04:给定一个非负整数c,你要判断是否存在两个整数a和b,使得a*a+b*b=c。【举例】c=5时,返回true。c=4时,返回true。c=3时,返回false。
2021-05-04:给定一个非负整数c,你要判断是否存在两个整数a和b,使得aa+bb=c.[举例]c=5时,返回true.c=4时,返回true.c=3时,返回false. 福大大 答案2021- ...
- 我写了本开源书:《3D编程模式》
大家好,我写了本开源书,罗列了我从自己的实战项目中提炼出来的关于3D编程(主要包括"3D引擎/游戏引擎"."编辑器"开发)的各种编程模式 本书的在线阅读地址在这 ...
- IntelliJ IDEA一站式配置【全】(提高开发效率)
IDEA常用设置(提高开发效率) 本人也是IDEA编译器的忠实用户了,但是有时出于各种原因,比如更换设备等等,IDEA总是需要重新安装配置.这就让我比较苦恼,因为总是记不全自己之前都修改了哪些地方(原 ...
- ODOO13 之十 :Odoo 13开发之后台视图 – 设计用户界面
Odoo 13开发之后台视图 – 设计用户界面 本文将学习如何为用户创建图形化界面来与图书应用交互.我们将了解不同视图类型和小组件(widgets)之间的差别,以及如何使用它们来提供更优的用户体验. ...