利用mysql explain来对sql语句进行优化,你需要懂这些关键字各表示的含义,这样优化才有的放矢。

语法格式如下:

EXPLAIN SELECT SQL

语法格式说明:

EXPLAIN:分析查询语句的关键字。

SELECT:执行查询语句的关键字。

SQL:查询语句。

接下来对输出结果进行简单的解释。

(1)id:表示SELECT语句的序列号,有多少个SELECT语句就有多少个序列号。如果当前行的结果数据中引用了其他行的结果数据,则该值为NULL。

(2)select_type:查询类型,表示当前SQL语句是简单查询还是复杂查询。常见取值如下:

SIMPLE:简单查询,不包含任何连接查询和子查询。

PRIMARY:主查询或者包含子查询时最外层的查询语句。

UNION:当前SQL语句是连接查询时,表示连接查询的第二个SELECT语句或者第二个后面的SELECT语句。

DEPENDENT UNION:含义与UNION几乎相同,但是DEPENDENT UNION取决于外层的查询语句。

UNION RESULT:表示连接查询的结果信息。

SUBQUERY:表示子查询中的第一个查询语句。

DEPENDENT SUBQUERY:含义与SUBQUERY几乎相同,但是DEPENDENTSUBQUERY取决于外层的查询语句。

DERIVED:表示FROM子句中的子查询。

MATERIALIZED:表示实例化子查询。

UNCACHEABLE SUBQUERY:表示不缓存子查询的结果数据,重新计算外部查询的每一行数据。

UNCACHEABLE UNION:表示不缓存连接查询的结果数据,每次执行连接查询时都会重新计算数据结果。

(3)table:当前查询(连接查询、子查询)所在的数据表。

(4)partitions:如果当前数据表是分区表,则表示查询结果匹配的分区。

(5)type:当前SQL语句所使用的关联类型或者访问类型,

其取值从最优到最差依次为

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

system:查询的数据表中只有一行数据,是const类型的特例。

const:数据表中最多只有一行数据符合查询条件,当查询或连接的字段为主键或唯一索引时,则type的取值为const。简单示例如下:

eq_ref:如果查询语句中的连接条件或查询条件使用了主键或者非空唯一索引包含的全部字段,则type的取值为eq_ref,典型的场景为使用“=”操作符比较带索引的列。

ref:当查询语句中的连接条件或者查询条件使用的索引不是主键和非空唯一索引,或者只是一个索引的一部分,则type的取值为ref,典型的场景为使用“=”带索引的列。简单示例如下:

此时,product_order_operate表orderNum字段上添加有普通索引

fulltext:当查询条件使用了全文索引时,type的取值为fulltext。

ref_or_null:类似于ref,但是当查询语句的连接条件或者查询条件包含的列有NULL值时,MySQL会进行额外查询,经常被用于解析子查询。简单示例如下:

index_merge:当查询语句使用索引合并优化时,type的取值为index_merge。此时,key列会显示使用到的所有索引,key_len显示使用到的索引的最长键长值。简单示例如下:

此时,orderNum字段上添加有唯一索引。

unique_subquery:当查询语句的查询条件为IN的语句,并且IN语句中的查询字段为数据表的主键或者非空唯一索引字段时,type的取值为unique_subquery。

index_subquery:与unique_subquery类似,但是IN语句中的查询字段为数据表中的非唯一索引字段。

range:当查询语句的查询条件为某个范围的记录时,type的取值为range。key列会显示使用的索引,key_len显示使用索引的最长键长值。典型的场景为使用=、<>、>、>=、<、<=、IS [NOT] NULL、<=>、BETWEEN AND或者IN操作符时,用常量比较关键字的列。简单示例如下:

index:当查询语句中的查询条件使用的是覆盖索引,也就是说查询条件中的字段包含索引中的全部字段,并且按照索引中字段的顺序进行条件匹配,此时只需要扫描索引树即可。另外,当查询语句的条件只是按照索引顺序查找数据行时,也只需要扫描索引树即可。简单示例如下:

ALL:每次进行连接查询时,都会进行完整的表扫描。查询性能最差,需要添加索引来避免此类型的查询。简单示例如下:

(6)possible_keys:执行查询语句时可能用到的索引,但是在实际查询中未必会用到。当此列为NULL时,说明没有可使用的索引,此时可以通过建立索引来提高查询的性能。

(7)key:执行查询语句时MySQL实际会使用到的索引。如果MySQL实际没有使用索引,则此列为NULL。

(8)key_len:执行查询语句时实际用到的索引按照字节计算的长度值,可以通过此字段计算MySQL实际上使用了复合索引中的多少字段。如果key列值为NULL,则key_len列值也为NULL。

(9)ref:数据表中的哪个列或者哪个常量用来和key列中的索引做比较来检索数据。如果此列的值为func,则说明使用了某些函数的结果数据与key列中的索引做比较来检索数据。

(10)rows:查询数据时必须查找的数据行数,当数据表的存储引擎为InnoDB时,值为MySQL的预估值。

(11)Extra:在执行查询语句时额外的详细信息。EXPLAIN语句支持使用JSON格式输出结果信息,例如:

using filesort(性能非常差):说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。mysql中无法利用索引完成的排序称为文件排序。

using temporary(性能非常差):新建了内部临时表,使用了临时表保存中间结果。常见于order by、group by,所以分组和排序一定要按照锁建立的索引的名字和顺序。

mysql explain关键字解析相关推荐

  1. 从线上慢sql看explain关键字

    大家好,我是烤鸭:     最近有点忙的头晕,又懒又累,正好线上遇到慢sql的问题,就说下 MySQL Explain 关键字的解析和使用示例. explain 关键字说明 使用explain关键字可 ...

  2. [MySQL]--查询性能分析工具-explain关键字

    explain显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. explain的使用方法很简单,只需要在select查询语句前面加上expl ...

  3. MySQL 优化之 EXPLAIN 关键字

    MySQL查询优化之explain的深入解析 0. 准备 首先执行如下的 sql 语句: CREATE TABLE IF NOT EXISTS `article` (`id` int(10) unsi ...

  4. 3、mysql索引优化一:Explain关键字分析

    作为一个Java开发,在我们日常工作中,对于mysql的使用中涉及最多的恐怕就是写SQL了,一定遇到过sql执行慢的问题,那么SQL优化工作就显得格外重要.有了对mysql执行过程以及索引实现原理了解 ...

  5. mysql分析表关键字_SQL调优利器——explain关键字详解(MySQL)

    前言 有时候,我们写好SQL后发现执行查询的时间超过了预期,但自己已经有根据表的已有索引去写SQL语句,这个时候就要考虑是否是在查询的过程中出现了索引失效的问题.那么我们可以怎么样去验证SQL在执行过 ...

  6. mysql explain output_MySQL查询优化之explain的深入解析【转载】

    在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.expla ...

  7. mysql 优化关键字_MySQL 优化之 EXPLAIN 关键字

    0. 准备 首先执行如下的 sql 语句: CREATE TABLE IF NOT EXISTS `article` (`id` int(10) unsigned NOT NULL AUTO_INCR ...

  8. mysql 优化关键字_Mysql之Explain关键字及常见的优化手段

    Explain关键字字段描述: Explain关键字字段详情描述 id 我们写的查询语句一般都以SELECT关键字开头,比较简单的查询语句里只有一个SELECT关键字,但是下边两种情况下在一条查询语句 ...

  9. mysql的explain关键字ken_len列

    mysql的explain关键字执行结果中有一个ken_len列,其值表示这个SQL在执行用到的索引列的长度,在使用联合索引(多列)时用于判断使用了哪些索引列. 常用类型计算规则如下: char(n) ...

  10. explain ref_什么是MySQL的执行计划(Explain关键字)?

    本文作者王良辰,京东中台架构师,擅长分布式系统及高可用.高并发系统架构与设计.曾经为企业开发过多个通用脚手架,推崇以技术手段提升开发效率.约束开发行为. 什么是Explain Explain被称为执行 ...

最新文章

  1. UVA11020 优势人群(multiset)
  2. 用锤子发射导弹,程序员的世界你不懂
  3. 鸿蒙系统是安卓还是苹果,小雷问答丨鸿蒙系统到底和苹果安卓有什么区别?
  4. Qt 有层级关系的qss样式,使用id定位到具体控件
  5. DM3730 LCD控制器驱动框架
  6. python 列表数据类型 200221
  7. Linux Kernel Lock types and their rules
  8. 日历小程序C语言,微信小程序实现日历功能
  9. java 开源框架集
  10. 旧计算机 云桌面,切换桌面(云桌面切换到自己电脑)
  11. excel二极管伏安特性曲线_电视机不被烧,是因为它?一个拥有反向特性的稳压二极管...
  12. 魔兽n服务器网站,wowN服如何进入_魔兽世界Nostalrius服务器入驻攻略_快吧游戏
  13. C语言:求一个四位数的个位、十位、百位、千位分别为多少
  14. 解锁三星bl锁有几种方法_如何判断三星手机bootloader是否解锁_免费解锁BL的3个方法...
  15. 【Linux 中国】Simula 诞生之前的面向对象程序设计
  16. react浏览器兼容报错处理
  17. 字节跳动安全AI挑战赛总结
  18. python 生孩子朋友圈_宝宝出生怎么发朋友圈 生宝宝朋友圈报喜的句子
  19. 网络偷窥者很多,如何消除上网的浏览痕迹?
  20. Sothink SWF Decompiler 4

热门文章

  1. 数据分析--Python连接阿里云数据库
  2. #9733;双十一背后的消费心理
  3. 语音助手——评测指标
  4. JavaEE | 多线程基础
  5. OSChina 周五乱弹 ——给网戒中心打电话,结果……
  6. 练习题目---光照度
  7. ansible (一)
  8. 嗅探原理与反嗅探技术详解
  9. 微信公众号申请注意事项
  10. 使用C# 开发Pocket PC 应用程序(转)