​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 输出分析的更多相关文章

  1. MySQL SQL Explain输出学习

    MySQL的explain命令语句提供了如何执行SQL语句的信息,解析SQL语句的执行计划并展示,explain支持select.delete.insert.replace和update等语句,也支持 ...

  2. 【mysql】explain性能分析

    1. explain的概念 使用EXPLAIN 关键字可以模拟优化器执行SQL 查询语句,从而知道MySQL 是如何处理你的SQL 语句的.分析你的查询语句或是表结构的性能瓶颈. 用法: Explai ...

  3. MySQL的explain语句分析

    +----+-------------+-------+------------+------+---------------+-----+---------+------+------+------ ...

  4. mysql中explain优化分析

    效率比较  range >index  > all

  5. MySQL 性能优化神器 Explain 使用分析

    简介 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. EXPLAIN 命令用法十分简单, 在 ...

  6. mysql优化:explain分析sql语句执行效率

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...

  7. 【Explain】mysql之explain详解(分析索引的最佳使用)

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain 这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句 ...

  8. mysql优化–explain分析sql语句执行效率

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...

  9. 用 Explain 命令分析 MySQL 的 SQL 执行

    在上一篇文章<MySQL常见加锁场景分析>中,我们聊到行锁是加在索引上的,但是复杂的 SQL 往往包含多个条件,涉及多个索引,找出 SQL 执行时使用了哪些索引对分析加锁场景至关重要. 比 ...

随机推荐

  1. Windows鼠标右键菜单添加SublimeText打开选项

    Windows上将使用SublimeText打开文件的选项添加到鼠标右键菜单. 新建reg后缀的注册表文件,编辑添加内容 Windows Registry Editor Version 5.00 [H ...

  2. TCP/IP协议栈---网络基础篇(3)

    TCP/IP协议栈 在网络中实际使用的是TCP/IP,OSI是参考模型. TCP/IP协议栈 – 是由一组不同功能的协议组合在一起构成的协议栈 – 利用一组协议完成OSI所实现的功能 应用层协议 传输 ...

  3. 【算法•日更•第六期】头脑风暴:洛谷P1528 切蛋糕题解

    ▎(一个没有用处的)前言 为什么这次题解特意写明题号呢?因为我发现了这样的事情: 所以不要混了,想看P1714题解的同志们可以圆润的滚开了. 好了,不说没用的了,切入正题: ▎题目 题目及测评链接:戳 ...

  4. HDU 2121:Ice_cream’s world II(不定根的最小树形图)

    题目链接 题意 求有向图的最小生成树,且根不定. 思路 最小树形图即求有向图的最小生成树,用的是朱刘算法. 这里不定根,那么可以建立一个虚根,让虚根和所有点相连,权值为一个很大的数(这里直接设为所有边 ...

  5. NEST 6.X升级到7.X

    升级比对可访问 NEST 6.X升级到7.X 查看 ElasticClient-CreateIndex 升级前代码,NEST版本6.6.0 ICreateIndexResponse response ...

  6. 寻觅Azure上的Athena和BigQuery (二):神奇的PolyBase

    前情回顾 在“数据湖”概念与理论逐渐深入人心的今天,面向云存储的交互式查询这个需求场景显得愈发重要.这是因为原生的云存储(主要指S3这样的对象存储)既能够容纳大容量的明细数据,又能在性能和成本间取得一 ...

  7. Nginx+Lua+MySQL/Redis实现高性能动态网页展现

    Nginx结合Lua脚本,直接绕过Tomcat应用服务器,连接MySQL/Redis直接获取数据,再结合Lua中Template组件,直接写入动态数据,渲染成页面,响应前端,一次请求响应过程结束.最终 ...

  8. [01] HEVD 双机调试环境搭建

    [01] HEVD 双机调试环境搭建 span::selection, .CodeMirror-line > span > span::selection { background: #d ...

  9. WinForm控件之【MaskedTextBox】

    基本介绍 掩码文本控件,使用掩码来区分用户输入文本是否正确. 常设置属性 BeepOnError:指示键入无效字符是控件是否发出系统提示音: CutCopyMaskFormat:设置控件文本值复制到剪 ...

  10. WinForm控件之【ComboBox】

    基本介绍 下拉文本框应用较为广泛,在winfrom控件当中使用设置也是相对的简单,主要用于存在多种选择的单选操作场景. 常设置属性.事件 DataSource:绑定加载项的数据源,设置属性Displa ...