点击上方蓝色字体,选择“设为星标”

优质文章,及时送达

写在前面

MySql Explain是对SQL进行性能优化不可或缺的工具,通过他我们可以对SQL进行一定的分析和性能优化,降低线上业务因慢查询造成的性能损失。

了解Explain

执行计划依赖于表,列,索引等细节和where中的条件,mysql优化器利用多种技术来有效的执行一条sql中的查询语句,比如在大表中的一个查询可以不通过全表扫描来完成。

一个涉及到多表的join操作可以避免比较每种的组合情况,优化器选择最优的效果查询对一个集合进行操作,通过explain语句可以获取mysql如何执行语句的信息。

输出信息

explain对select语句操作返回一行输出信息,表示的顺序是mysql处理语句时实际读取表的顺序。

mysql通过嵌套循环方式解决所有join操作。就是说mysql从第一个表中读取一行,在第二个表中找到匹配的一行,之后在找到第三个表,以此类推。 explain输出列包含如下信息:

id

执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置

select_type

显示本行是简单或复杂select。如果查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNION RESUlT)

table

访问引用哪个表(引用某个查询,如“derived3”)

type

数据访问/读取操作类型(ALL、index、range、ref、eq_ref、const/system、NULL)

possible_keys

揭示哪一些索引可能有利于高效的查找

key

显示mysql决定采用哪个索引来优化查询

key_len

显示mysql在索引里使用的字节数

ref

显示了之前的表在key列记录的索引中查找值所用的列或常量

rows

为了找到所需的行而需要读取的行数,估算值,不精确。通过把所有rows列值相乘,可粗略估算整个查询会检查的行数

Extra

额外信息,如using index、filesort等

id

id是用来顺序标识整个查询中SELECT语句的,在嵌套查询中id越大语句优先执行。如果这一列用来说明的是其他行的联合结果,该值可能为null。

select_type

表示的是查询的类型,类型如下:

  • simple:简单子查询,不包含子查询和union

  • primary:包含union或者子查询,最外层的部分标记为primary

  • subquery:一般子查询中的子查询被标记为subquery,也就是位于select列表中的查询

  • derived:派生表——该临时表是从子查询派生出来的,位于form中的子查询

  • union:位于union中第二个及其以后的子查询被标记为union,第一个就被标记为primary如果是union位于from中则标记为derived

  • union result:用来从匿名临时表里检索结果的select被标记为union result

  • dependent union:顾名思义,首先需要满足UNION的条件,及UNION中第二个以及后面的SELECT语句,同时该语句依赖外部的查询

  • subquery:子查询中第一个SELECT语句

  • dependent subquery:和DEPENDENT UNION相对UNION一样

table

对应的行正在访问哪个表,表名或者别名。

  • 关联优化器会为查询选择关联顺序,左侧深度优先

  • 当from中有子查询的时候,表名是derivedN的形式,N指向子查询,也就是explain结果中的下一列

  • 当有union result的时候,表名是union 1,2等的形式,1,2表示参与union的query id 注意:MySQL对待这些表和普通表一样,但是这些“临时表”是没有任何索引的。

type

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到ref。

  • All:最坏的情况,全表扫描

  • index:和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小很多

  • range:范围扫描,一个有限制的索引扫描。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range

  • ref:一种索引访问,它返回所有匹配某个单个值的行。此类索引访问只有当使用非唯一性索引或唯一性索引非唯一性前缀时才会发生。这个类型跟eq_ref不同的是,它用在关联操作只使用了索引的最左前缀,或者索引不是UNIQUE和PRIMARY KEY。ref可以用于使用=或<=>操作符的带索引的列。

  • eq_ref:最多只返回一条符合条件的记录。使用唯一性索引或主键查找时会发生 (高效)

  • const:当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。当主键放入where子句时,mysql把这个查询转为一个常量(高效)

  • system:这是const连接类型的一种特例,表仅有一行满足条件。

  • Null:意味说mysql能在优化阶段分解查询语句,在执行阶段甚至用不到访问表或索引(高效)

possible_keys

显示查询使用了哪些索引,表示该索引可以进行高效地查找,但是列出来的索引对于后续优化过程可能是没有用的

key

key列显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len

key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好 。

ref

ref列显示使用哪个列或常数与key一起从表中选择行。

rows

rows列显示MySQL认为它执行查询时必须检查的行数。注意这是一个预估值。

Extra

Extra是EXPLAIN输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息,MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。

Using filesort

MySQL有两种方式可以生成有序的结果,通过排序操作或者使用索引,当Extra中出现了Using filesort 说明MySQL使用了后者,但注意虽然叫filesort但并不是说明就是用了文件来进行排序,只要可能排序都是在内存里完成的。大部分情况下利用索引排序更快,所以一般这时也要考虑优化查询了。使用文件完成排序操作,这是可能是ordery by,group by语句的结果,这可能是一个CPU密集型的过程,可以通过选择合适的索引来改进性能,用索引来为查询结果排序。

Using temporary

用临时表保存中间结果,常用于GROUP BY 和 ORDER BY操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。

Not exists

MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了。

Using index

说明查询是覆盖了索引的,不需要读取数据文件,从索引树(索引文件)中即可获得信息。如果同时出现using where,表明索引被用来执行索引键值的查找,没有using where,表明索引用来读取数据而非执行查找动作。这是MySQL服务层完成的,但无需再回表查询记录。

Using index condition

这是MySQL 5.6出来的新特性,叫做“索引条件推送”。简单说一点就是MySQL原来在索引上是不能执行如like这样的操作的,但是现在可以了,这样减少了不必要的IO操作,但是只能用在二级索引上。

Using where

使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。注意:Extra列出现Using where表示MySQL服务器将存储引擎返回服务层以后再应用WHERE条件过滤。

Using join buffer

使用了连接缓存:Block Nested Loop,连接算法是块嵌套循环连接;Batched Key Access,连接算法是批量索引连接

impossible where

where子句的值总是false,不能用来获取任何元组

select tables optimized away

在没有GROUP BY子句的情况下,基于索引优化MIN/MAX操作,或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。

distinct

优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

简单了解SQL性能优化工具MySql Explain相关推荐

  1. MySQL中级优化教程(一)——SQL常用优化工具及explain语句的使用

    序言: 说来惭愧,java学了两年,期间虽在博客上记了一些东西,可也不曾写过什么系统的教程,前一段时间开始学习MySQL数据库优化相关的知识,就想着趁着这个机会好好整理一份电子档出来,即方便自己之后回 ...

  2. SQL性能优化工具TKPROF

     全名为Trace Kernel Profile,用来格式化跟踪文件,是一个命令行工具. 主要的格式例如以下: tkprof tracefile outputfile - tracefile:要分 ...

  3. MySQL高性能实战——part3——分析SQL,定位慢SQL(性能优化的前提)

    前言: 此文借鉴<MySQL高性能>一书,还有MySQL官方文档,笔者将通过自身的一些实战经验和阅读习惯对本书进行一个总结,整理,归纳出企业级开发中常用的优化案列和部分概念!! ​ 官方文 ...

  4. 你真的会用EXPLAIN么,SQL性能优化王者晋级之路

    MySQL 8.0新特性专栏目录 <MySQL开发规范>过时了,视图查询性能提升了一万倍 你真的会用EXPLAIN么,SQL性能优化王者晋级之路 索引三剑客之降序索引和不可见索引 千呼万唤 ...

  5. Android 性能优化工具 TraceView 简单使用

    背景 最近产品以及测试大佬反应快搜桌面进入搜索页面跳转较为缓慢,影响体验,为了优化这个问题,特地学习Android 性能优化工具 TraceView的 简单使用,这才有了本文. 正文 如下图打开and ...

  6. 性能优化之MySQL优化(转)

    MYSQL优化浅谈 原文地址:https://www.cnblogs.com/moss_tan_jun/p/8025517.html 参考慕课网学习视频:性能优化之MySQL优化 msyql是开发常用 ...

  7. 性能优化之MySQL优化

    文章目录 第1章 数据库优化简介 数据库优化的目的 数据库优化的方式 第2章 SQL语句优化 SELECT语句 - 语法顺序: SELECT语句 - 执行顺序: 2-1 数据准备 2-2 MySQL慢 ...

  8. SQL性能优化技巧,常见优化10经验,数据库查询好慢,还能怎么办

    我熟练应用ctrl c和ctrl v 开发curd代码好多年了. mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题. 遇到这种问题,我们一般也会想到是因为索引. 那 ...

  9. Oracle SQL性能优化的40条军规

    Oracle SQL性能优化的40条军规 1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 & ...

最新文章

  1. php数组包含对象吗,在包含数组的PHP对象上调用方法
  2. Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合
  3. poj 1474 Video Surveillance - 求多边形有没有核
  4. Java中的集合类--复习
  5. python 爬虫实例-python爬虫实例,一小时上手爬取淘宝评论(附代码)
  6. CaaS环境下实践经验总结(二):监控系统部署
  7. 【强化学习】Actor-Critic
  8. 序列表转换成横向菜单
  9. 斐讯N1刷Armbian_5.62,无法自动获取到ip怎么办?
  10. oracle组合索引最左原则,复合索引最左原则 -- 实战
  11. 位运算(异或运算) :数组中数字出现的次数
  12. 2017极客大奖评选进行时:年度十大消费科技产品花落谁家
  13. 单片机c语言编程实训心得,单片机实训心得体会
  14. PyCharm入门使用教程-最强版本
  15. 用MUI花两天时间快速开发『One·一个』App,兼容Android、iOS双平台
  16. JSP报刊订阅管理系统
  17. kali实现ARP断网
  18. 用图片签名时,如何解决签名的图片会盖住内容的问题
  19. 全球及中国纺织机械行业运营规划与十四五投资状况分析报告2022版
  20. 进制转换器的c代码实现

热门文章

  1. 0x06.基本算法 — 倍增
  2. 浏览器tab关闭事件_翻译|揭示现代浏览器原理(2):网页访问 — Chrome官方
  3. python并发1000个http请求_php下api接口的并发http请求
  4. pta 7-3 两个有序链表序列的合并 (20 分)
  5. JavaScript函数式编程学习
  6. 【基础】CSS实现多重边框的5种方式
  7. linux 编程笔记1 crusher for linux
  8. Rails 添加新的运行环境
  9. 手动删除EXCHANGE2010
  10. pku 1077 Eight