Mysql中Explain详解及索引的最佳实践
Mysql中Explain详解及索引的最佳实践
- 1.Explan工具的介绍
- 1.1 Explan 分析示例
- 1.2 Explain中的列
- 1.2.1 id
- 1.2.2 select_type
- 1.2.3 table
- 1.2.4 partitions
- 1.2.5 type
- 1.2.6 possible_keys
- 1.2.7 key
- 1.2.8 key_len
- 1.2.9 ref
- 1.2.10 rows
- 1.2.11 filtered
- 1.2.12 Extra
1.Explan工具的介绍
-
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析查询语句
-
在 SELECT 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL
1.1 Explan 分析示例
参考文档:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
--示例表
DROP TABLE IF EXISTS `system_encryption_user`;
CREATE TABLE `system_encryption_user` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`login_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录名',`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'email',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',`mobilephone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '手机',`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '固定电话',`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '用户密码',`company_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属分公司',`dept` int(10) NULL DEFAULT NULL COMMENT '所属部门',`is_delete` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 445 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;INSERT INTO `system_encryption_user` VALUES (1, 'superAdmin', 'Zsxxxxxx@163.com', '超级管理员', '12345678910', '12345678910', '$2a$10$UUZGvFdSju3/kT6H7lMmF.', NULL, 0);DROP TABLE IF EXISTS `system_encryption_role`;
CREATE TABLE `system_encryption_role` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id ',`role_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '角色名称',`role_description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '角色描述',PRIMARY KEY (`id`) USING BTREE,INDEX `index_name`(`role_name`(191)) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;INSERT INTO `system_encryption_role` VALUES (1, 'SUPERADMIN', '超级管理员');DROP TABLE IF EXISTS `system_encryption_user_role`;
CREATE TABLE `system_encryption_user_role` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`user_id` int(11) NULL DEFAULT NULL COMMENT '用户id',`role_id` int(11) NULL DEFAULT NULL COMMENT '角色id',PRIMARY KEY (`id`) USING BTREE,INDEX `index_user_role`(`user_id`, `role_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 411 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of system_encryption_user_role
-- ----------------------------
INSERT INTO `system_encryption_user_role` VALUES (1, 1, 1);
EXPLAIN SELECT * FROM system_encryption_user WHERE id=1;

1.2 Explain中的列
1.2.1 id
id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。
1.2.2 select_type
select_type 表示对应的是简单的还是复杂的查询
-
simple 简单查询 查询不包含子查询和union
EXPLAIN SELECT * FROM system_encryption_user WHERE id=1;
-
primary 复杂查询中最外层的SELECT
-
subquery 包含在SELECT 中子查询(不在from子句中)
-
derived 包含在from子句中的子查询 临时表也称为(衍生表或者派生表)
-- 关闭mysql 5.7 版本对衍生表的优化 set session optimizer_switch='derived_merge=off';EXPLAIN SELECT (SELECT 1 FROM system_encryption_user WHERE id=1) FROM (SELECT * FROM system_encryption_user WHERE id=1) exp
-
在 union 中的第二个和随后的 select
-- 恢复 set session optimizer_switch='derived_merge=on'; EXPLAIN SELECT * FROM system_encryption_user UNION ALL SELECT * FROM system_encryption_user
1.2.3 table
表示Explain优化器正在访问哪个表
- 当 from 子句中有子查询时,table列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查
询。 - 当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的 select 行id。
1.2.4 partitions
如果查询是基于分区表的话,partitions 字段会显示查询将访问的分区。
1.2.5 type
关联类型或访问类型
依次从最优到最差分别为:
system >const>eq_ref>ref>range>index>ALL
- NULL 不需要访问表或索引
EXPLAIN SELECT MIN(id) FROM system_encryption_user_role
- const,system : mysql能对查询的某部分进行优化并将其转化成一个常量用于primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。system是const的特例,表里只有一条元组匹配时为system
EXPLAIN SELECT * FROM (SELECT * FROM system_encryption_user WHERE id=1) tmp;
1.2.6 possible_keys
1.2.7 key
1.2.8 key_len
1.2.9 ref
1.2.10 rows
1.2.11 filtered
1.2.12 Extra
相关文章:
Mysql中Explain详解及索引的最佳实践
Mysql中Explain详解及索引的最佳实践1.Explan工具的介绍1.1 Explan 分析示例1.2 Explain中的列1.2.1 id1.2.2 select_type1.2.3 table1.2.4 partitions1.2.5 type1.2.6 possible_keys1.2.7 key1.2.8 key_len1.2.9 ref1.2.10 rows1.2.11 filtered1.2.12 Extra1.Explan工具的介绍…...
JavaScript 内的 this 指向
在 javascript 语言中, 有一个奇奇怪怪的 “关键字” 叫做 this为什么说它是 奇奇怪怪 呢, 是因为你写出 100 个 this, 可能有 100 个解释, 完全不挨边,但是, 在你的学习过程中, 搞清楚了 this 这个玩意, 那么会对你的开发生涯有很大帮助的,接下来咱们就…...
Java多种方法实现等待所有子线程完成再继续执行
简介 在现实世界中,我们常常需要等待其它任务完成,才能继续执行下一步。Java实现等待子线程完成再继续执行的方式很多。我们来一一查看一下。 Thread的join方法 该方法是Thread提供的方法,调用join()时,会阻塞主线程࿰…...
制造企业数字化工厂建设步骤的建议
随着工业4.0、中国制造2025的深度推进,越来越多的制造企业开始迈入智能制造的领域,那数字工厂要从何入手呢? 数字工厂规划的核心,也正是信息域和物理域这两个维度,那就从这两个维度来进行分析,看如何进行数…...
网上鲜花交易平台,可运行
文章目录项目介绍一、项目功能介绍1、用户模块主要功能包括:2、商家模块主要功能包括:3、管理员模块主要功能包括:二、部分页面展示1、用户模块部分功能页面展示2、商家模块部分功能页面展示3、管理员模块部分功能页面展示三、部分源码四、底…...
【实战】用 Custom Hook + TS泛型实现 useArray
文章目录一、题目二、答案(非标准)三、关键知识点1.Custom Hook关键点案例useMountuseDebounce2.TS 泛型关键点一、题目 完善自定义 Hook —— useArray ,使其能够完成 tryUseArray 组件中测试的功能: 入参:数组返回…...
【LeetCode】剑指 Offer(18)
目录 题目:剑指 Offer 35. 复杂链表的复制 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offer 35. 复杂链…...
Kubernetes节点运行时从Docker切换到Containerd
由于k8s将于1.24版本弃用dockershim,所以最近在升级前把本地的k8s切换到了Containerd运行时,目前我的k8s版本是1.22.5,一个master,二个Node的配置,以下做为一个操作记录日志整理,其它可以参考官网文档。 在…...
【编程基础之Python】12、Python中的语句
【编程基础之Python】12、Python中的语句Python中的语句赋值语句条件语句循环语句for循环while循环continue语句break语句continue与break的区别函数语句pass语句异常处理语句结论Python中的语句 Python是一种高级编程语言,具有简单易学的语法,适用于各…...
android h5餐饮管理系统myeclipse开发mysql数据库编程服务端java计算机程序设计
一、源码特点 android h5餐饮管理系统是一套完善的WEBandroid设计系统,对理解JSP java,安卓app编程开发语言有帮助(系统采用web服务端APP端 综合模式进行设计开发),系统具有完整的源代码和数据库,系统主要…...
容易混淆的嵌入式(Embedded)术语
因为做嵌入式开发工作虽然跳不出电子行业,但还是能接触到跨度较大的不同行当,身处不同的圈子。诸如医疗,银行,车载,工业;亦或者手机,PC,专用芯片;甚至可能横跨系统开发、…...
Nodejs 中 JSON 和 YAML 互相转换
JSON 转换成 YAML 1. 安装 js-yaml 库: npm install js-yaml2. 在程序中引入依赖库 const yaml require(js-yaml);3. 创建一个 js 对象, 代表 json 数据 const jsonData {name: John,age: 30,city: New York };4. 使用 yaml.dump() 把 js 对象转换成 YAML, 返回 YAML 字符…...
C++入门教程||C++ 修饰符类型||C++ 存储类
C 修饰符类型 C 允许在 char、int 和 double 数据类型前放置修饰符。修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求。 下面列出了数据类型修饰符: signedunsignedlongshort 修饰符 signed、unsigned、long 和 short 可应用于整型&#…...
Android开发面试:Java知识答案精解
目录 Java 集合 集合概述 HashMap ConcurrentHashMap 泛型 反射 注解 IO流 异常、深浅拷贝与Java8新特性 Java异常 深浅拷贝 Java8新特性 并发 线程 线程池 锁 volatile JVM 内存区域 内存模型 类加载机制 垃圾回收机制 如何判断对象已死 Java 集合 …...
Windows上一款特别好用的画图软件
安装 废话不多说,打开windows的应用商店,搜索draw.io,点击获取即可。 画图 draw.io的布局左边是各种图形组件,中间是画布,右边是属性设置,文件扩展名是.drawio。 点击左边列表中的图形可以将它添加到画…...
html--学习
javascrapt交互,网页控制JavaScript:改变 HTML 图像本例会动态地改变 HTML <image> 的来源(src):点亮灯泡<script>function changeImage() {elementdocument.getElementById(myimage) #内存变量࿰…...
关于递归处理,应该怎么处理,思路是什么?
其实问题很简单,就是想要循环遍历整个data对象,来实现所有name转成label,但是想到里面还有children属性,整个children里面可能还会嵌套很多很多的name,如此循环,很难搞,知道使用递归,…...
重磅!牛客笔试客户端可防ChatGPT作弊
上线俩月,月活过亿。爆火的ChatGPT能代写文,撕代码,善玩梗,秒答题,几乎“无所不能”,争议也随之而来。调查显示,截至2023年1月,美国89%的大学生利用ChatGPT应付作业,53%的…...
春季训练营 | 前端+验证直通车-全实操项目实践,履历加成就业无忧
“芯动的offer”是2023年E课网联合企业全新推出集训培优班(线下),针对有一定基础(linux、verilog、uvm等)在校学生以及想要通过短时间的学习进入到IC行业中的转行人士,由资深IC设计工程师带教,通…...
2.详解URL
文章目录视图函数1.1endpoint简介1.2 装饰器注册路由源码浅析1.3 另一种注册路由的方式---app.add_url_rule()1.4 视图函数中添加自定义装饰器2 视图类2.1 视图类的基本写法3 详细讲解注册路由的参数3.1常用的参数3.2不常用的参数(了解)视图函数 1.1endpoint简介 endpint参数…...
戴尔Precision Pro商务笔记本回归,新一代产品聚焦便携性
看起来2026年是戴尔按下重启键的一年——在消费者和商用产品线中,戏剧性的品牌重塑都在被回归。有时候,老品牌确实是好品牌:熟悉的XPS名称和设计今年回归是有原因的,绝对不是因为戴尔Premium有正面的品牌认知度。在戴尔商务产品方…...
实测2-5分钟:CogVideoX-2b生成速度与画质平衡的真实体验报告
实测2-5分钟:CogVideoX-2b生成速度与画质平衡的真实体验报告 1. 从文字到视频:CogVideoX-2b能做什么? 想象一下,你只需要输入一段文字描述,就能在几分钟内获得一段6秒的高清视频。这不是科幻电影里的场景,…...
如何安全升级Cura软件版本:从风险规避到价值创造的全流程指南
如何安全升级Cura软件版本:从风险规避到价值创造的全流程指南 【免费下载链接】Cura 3D printer / slicing GUI built on top of the Uranium framework 项目地址: https://gitcode.com/gh_mirrors/cu/Cura UltiMaker Cura作为全球最受欢迎的3D打印切片软件&…...
【经验贴】运营岗考过CDA数据分析师一级经验分享
终于把CDA一级拿下了!查成绩那一刻真的挺开心的,不是多难,但全程自己一点点学出来,特别有成就感。今天就把我整个备考过程老老实实写出来,给正在准备的小伙伴一个参考。一、备考原因我最开始考CDA,完全是因…...
JavaWeb Listener 监听器详解:三大域对象监听 + 在线人数统计实战
前言Listener(监听器)是 JavaWeb 三大组件最后一个,专门用于监听 Web 域对象的创建、销毁、属性变化,在事件触发时自动执行逻辑。它是基于观察者模式实现,常用于:服务器初始化、在线用户统计、Session 监听…...
告别虚拟机!在Windows本地用Docker Compose一键部署MeterSphere测试平台
告别虚拟机!在Windows本地用Docker Compose一键部署MeterSphere测试平台 如果你是一名测试工程师或开发者,一定对MeterSphere这个开源持续测试平台不陌生。它集成了测试跟踪、接口测试、UI测试和性能测试等功能,兼容JMeter、Selenium等主流工…...
从‘噬菌体’到清晰地图:我的LIO-SAM避坑实战记录(含Ubuntu版本选择建议)
从“噬菌体”到清晰地图:LIO-SAM实战避坑指南与Ubuntu版本选择建议 第一次在RViz里看到那个旋转成筒状的地图时,我盯着屏幕足足愣了三分钟——这和我预想中的高精度点云地图相差了十万八千里。更令人崩溃的是,当我把设备搬到室外测试时&#…...
维普AIGC检测降AI率全流程攻略:从70%降到10%以下实操分享
维普AIGC检测降AI率全流程攻略:从70%降到10%以下实操分享 说一个最近碰到的真事。我们实验室一个师弟,论文用维普查了AIGC检测,结果出来AI率72.4%。他当场就懵了——因为他确实有用AI辅助写了一些段落,但自认为改了挺多的…...
QMCDecode:解锁QQ音乐加密文件的macOS终极解决方案
QMCDecode:解锁QQ音乐加密文件的macOS终极解决方案 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换…...
别只盯着显卡!CES上英伟达那个能装进口袋的AI超算,普通人怎么玩?
口袋里的AI革命:如何用英伟达Project DIGITS打造个人智能工作站 当大多数人还在讨论RTX 50系列显卡的游戏性能时,英伟达在CES 2025上悄悄展示了一个可能改变未来的小玩意——Project DIGITS。这个能装进口袋的AI超算,搭载GB10芯片,…...
