MySQL 之 Explain 输出分析
MySQL 之 Explain 输出分析
背景
前面的文章写过 MySQL 的事务和锁,这篇文章我们来聊聊 MySQL 的 Explain,估计大家在工作或者面试中多多少少都会接触过这个。可能工作中实际使用的不多,但是不论的自己学习还是面试,都需要掌握的。
Explain 可以使用在SELECT, DELETE, INSERT, REPLACE, and UPDATE 语句中,执行的结果会在每一行显示用到的每一个表的详细信息。简单语句可能结果就只有一行,但是复杂的查询语句会有很多行数据。
Explain 的使用
在 SQL 语句前面加上 explain,如:EXPLAIN SELECT * FROM a;
举个例子
CREATE TABLE `a` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `uid` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_uid` (`uid`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
采用上面的语句EXPLAIN SELECT * FROM a;,效果如下
通过图片我们可以看到执行过后会输出 12 个字段,那么每个字段是什么意思呢?我们来一一看下
Explain 输出的字段内容
id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows,filtered,extra
| 列名 | 含义 |
| id | 查询语句的标识 |
| select_type | 查询的类型 |
| table | 当前行所查的表 |
| partitions | 匹配的分区 |
| type | 访问类型 |
| possible_keys | 查询可能用到的索引 |
| key | mysql 决定采用的索引来优化查询 |
| key_len | 索引 key 的长度 |
| ref | 显示了之前的表在key列记录的索引中查找值所用的列或常量 |
| rows | 查询扫描的行数,预估值,不一定准确 |
| filtered | 查询的表行占表的百分比 |
| extra | 额外的查询辅助信息 |
常用字段详细介绍
1.id: 是用来顺序标识整个查询中 select 语句的,在嵌套查询中id越大的语句越先执行
2.select_type:
•simple: 简单的SELECT(不使用UNION或子查询)•primary: 最外面的SELECT•union: UNION中的第二个或更高的SELECT语句•dependent union: UNION中的第二个或更高的SELECT语句,取决于外部查询•union result: UNION的结果•subquery: 在子查询中首先选择SELECT•dependent subquery: 子查询中的第一个SELECT,取决于外部查询•derived: 派生表——该临时表是从子查询派生出来的,位于from中的子查询•uncacheable subquery: 无法缓存结果的子查询,必须为外部查询的每一行重新计算•uncacheable union: 在UNION中的第二个或更晚的选择属于不可缓存的子查询
3.table: 每一行引用的表名
4.type: 从上到下效果依次降低
•system: const 的一种特例,表中只有一行数据
•const: 当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。使用主键查询往往就是 const 级别的,非常高效
•eq_ref: 最多只返回一条符合条件的记录,通过使用在两个表有关联字段的时候
•ref: 通过普通索引查询匹配的很多行时的类型
•fulltext: 全文索引
•ref_or_null: 跟 ref 类似的效果,不过多一个列不能 null 的条件
•index_merge: 此连接类型表示使用了索引合并优化。在这种情况下,输出行中的 key 列包含使用的索引列表,key_len包含所用索引的最长 key 部分列表
•unique_subquery: 在使用 in 查询的情况下会取代 eq_ref
•range: 范围扫描,一个有限制的索引扫描。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range
•index: 类似全表扫描,只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小很多
•ALL: 全表扫描
5.possible_key: MySQL 可能采用的索引,但是并不一定使用
6.key: MySQL 正真使用的索引名称
7.rows: 预估的扫描行数,只能参考不准确8.extra: 该列包含了很多额外的信息,包括是否文件排序,是否有临时表等,很多时候这个字段很有用能提供很多信息
小结
今天简单的给大家介绍了一些 Explain 的输出信息,很多时候我们可能在平时很少接触,但是很多时候我们还是要掌握的。有些东西该记还得记,该背还得背,毕竟这个社会就是比的谁知道的多。
Java 极客技术公众号,是由一群热爱 Java 开发的技术人组建成立,专注分享原创、高质量的 Java 文章。如果您觉得我们的文章还不错,请帮忙赞赏、在看、转发支持,鼓励我们分享出更好的文章。
关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料。
MySQL 之 Explain 输出分析的更多相关文章
- MySQL SQL Explain输出学习
MySQL的explain命令语句提供了如何执行SQL语句的信息,解析SQL语句的执行计划并展示,explain支持select.delete.insert.replace和update等语句,也支持 ...
- 【mysql】explain性能分析
1. explain的概念 使用EXPLAIN 关键字可以模拟优化器执行SQL 查询语句,从而知道MySQL 是如何处理你的SQL 语句的.分析你的查询语句或是表结构的性能瓶颈. 用法: Explai ...
- MySQL的explain语句分析
+----+-------------+-------+------------+------+---------------+-----+---------+------+------+------ ...
- mysql中explain优化分析
效率比较 range >index > all
- MySQL 性能优化神器 Explain 使用分析
简介 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. EXPLAIN 命令用法十分简单, 在 ...
- mysql优化:explain分析sql语句执行效率
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...
- 【Explain】mysql之explain详解(分析索引的最佳使用)
在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain 这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句 ...
- mysql优化–explain分析sql语句执行效率
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...
- 用 Explain 命令分析 MySQL 的 SQL 执行
在上一篇文章<MySQL常见加锁场景分析>中,我们聊到行锁是加在索引上的,但是复杂的 SQL 往往包含多个条件,涉及多个索引,找出 SQL 执行时使用了哪些索引对分析加锁场景至关重要. 比 ...
随机推荐
- vuex中使用对象展开运算符
使用场景 当需要进行vuex进行数据状态管理的时候,会使用到mapGetters,mapState,还有自身的计算属性的时候,这个时候就会用到这个了! 1.首先需要安装 npm install bab ...
- 在同一页面中显示多个echart图表
整理了一下大概有两种做法来实现在同一个页面中显示多个echart图表,废话不说直接上代码. 在同一个echart对象中绘制多个图表 <!DOCTYPE html> <html lan ...
- 渐进式web应用开发---service worker (二)
阅读目录 1. 创建第一个service worker 及环境搭建 2. 使用service worker 对请求拦截 3. 从web获取内容 4. 捕获离线请求 5. 创建html响应 6. 理解 ...
- 不懂数据库索引的底层原理?那是因为你心里没点b树
本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 前几天下班回到家后正在处理一个白天没解决的bug,厕所突然传来对象的声音: ...
- Linux 勿卸载软件,所有命令不能用了咋办
1. 一次有趣的事 有个做技术的(不说什么岗位,容易被人喷,谁都有失手的时候),在公司的业务测试环境的机器,卸载了一个软件rpm -e --nodeps filesystem* , 导致机器所有的命令 ...
- vue接入萤石云视频
在萤石云开放平台注册开发者账号,网址:https://open.ys7.com/guide.html 在“开发者服务”-->“我的设备”里添加已有设备或者申请一个试用设备 然后点击“我的应用”里 ...
- 001-python3 初识
一.python的起源 python是一门 解释型弱类型编程语言. 特点: 简单.明确.优雅 二.python的解释器 CPython. 官方提供的. 内部使用c语言来实现 PyPy. 一次性把我们的 ...
- 探究Hybrid-APP技术原理
探究Hybrid-APP技术原理 author: @TiffanysBear 背景 随着Web技术的发展和移动互联网的发展,Hybrid技术已经成为一种前端开发的主流技术方案.那什么是Hybrid A ...
- 常见Code Review过程中发现的问题
软件环境:Spring MVC + MyBatis 主要体现在两个方面,一个是编码习惯问题,另一个是编码质量的问题.编码习惯主要有日志编写.代码注释以及编码风格的问题,而编码质量则与很多方面相关,比如 ...
- web应用分页
1. 场景描述 目前大部分的应用程序中都会用到分页功能,以便减少前端浏览器及后台服务器的压力,以及其他方面的考虑. (1)分页从概念上可分为逻辑分页和物理分页,逻辑分页主要是通过应用程序(前端或者后端 ...