explain分析字段:id、select_type、type、partitions、type、possible_keys、key、key_len、ref、rows、rows、filtered、extra



1.id列:
a.id越大执行优先级越高。
b.id相同则从上往下执行。
c.id为NULL最后执行。 2.select_type列:
a.simple,简单查询,不包括子查询和union。
b.primary,复杂查询最外层的select。
c.derived,包含在from中的子查询,mysql会将子查询的结果放入一个临时表中,也称为派生表。
d.subquery,包含在select关键字后面的子查询(不在from子句后面)
e.union,在union中的第二个和随后的select
f.union result, union临时表检索结果的select 3.table列:
a.table列表示explan这一行正在执行哪个表。
b.当table列为<derivedN>时,N为id列的代号,所以先执行id=N那一行。
c.当table列为<union1,2>时,表示id为1和2参与union的select。 4.partitions列:
a.如果查询是基于表分区的话,partitions列会显示当前的分区。
扩展:分区表:通俗地讲表分区是将一个大表,根据条件分割成若干个小表。 5.type列:这列表示关联类型或访问类型,mysql决定查找数据行的方式,查找数据行的大概范围。
依次从最优到最差:system > const > eq_ref > ref > range > index > all。一般要保证查询至少达到range级别,最好达到ref级别。
a.NULL:mysql在优化阶段分解查询语句,在执行时不需要访问表或索引。
b.const,system:mysql对查询的某部分进行优化并将其转化成一个常量,用于primary key或unique key的列与常量进行比较时,所以最多只有一行数据匹配,只用读取一次,所以速度比较快。system是const的特例,表里面只有一条数据。
c.eq_ref:primary key或unique key索引的所有部分被连接使用,最多只会返回一条符合条件的记录。这是除了const外最好的访问方式。普通的简单查询不是这种方式。
d.ref:相对于eq_ref,不使用唯一索引,使用普通索引或唯一索引的部分前缀,索引要与某个值进行比较,可能返回多条符合条件的记录。
e.range:范围查找,通常用于in,between,>,<等操作中,使用一个索引在查询给定范围的记录。
f.index:扫描索引就能得到想要的结果,一般是对某个二级索引进行扫描,这种扫描不能从索引树的根节点进行快速扫描,会对索引的叶子节点进行扫描、遍历,所以速度还是很慢的,这种查询一般是使用覆盖索引,因为二级索引相对比较小,所以会比all快些。
g.all:全表扫描,这种是对聚族索引的叶子节点进行遍历、扫描,所以比较慢,一般这种要增加索引进行优化。 6.possible_keys列:查询中可能使用到的索引。 7.key列:查询中使用到的索引。
a.当possible_keys不为null,key列为null时,这种情况是因为表里的数据不多,mysql根据执行成本计算,最终选择了全表扫描。
b.如果想要强制或忽略使用某一个索引时,可以在查询中使用force index或ignore index。一般不建议使用,mysql根据执行成本计算的,基本上都是最优的查询方式。 8.key_len列:msyql在索引中使用的字节数,通过这一列可以算出mysql具体使用了索引的那几列。
key_len的计算规则:
a.字符串,char(n)和varchar(n),5.0.3以后版本中,n均代表字符数,而不是字节数,如果是utf-8,一个数字或字母占一个字节,一个汉字占3个字节;如果是utf8mb4,一个汉字占4个字节。
* char(n):如果存汉字长度就是3n字节(utf-8)。
* varchar(n):如果存汉字(utf-8)则长度是3n+2字节,加的两个字节是为了存字符串长度,因为varchar是变长字符串。
b.数字类型:
* tinyint:1个字节。
* smallint:2个字节。
* int:4个字节。
* bigint:8个字节。
c.时间类型:
* date:3个字节。
* timestamp:4个字节。
* datetime:8个字节。
d.如果字段允许为null,需要用一个字节记录是否为null。 9.ref列:
a.这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有const(常量)、字段名(如:film.id)。 10.rows列:
a.这一列显示了mysql估计要扫描的行数,这个不是最终结果集的行数。 11.filtered列:该值是一个百分比的值,rows*filtered/100可以估算出将要和explain由前一个表进行连接的行数(前一个表指explain中的id值比当前表id值小的表) 12.extra列:
a.using index:使用覆盖索引
mysql的explain的key有使用到索引,select的查询结果都可以通过索引树拿到,这个情况一般可以说是用到了覆盖索引,extra列一般都有using index。
b.using where:使用where语句处理结束,查询出来的列未被索引覆盖。
c.using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围。
d.using temporary:mysql需要创建一张临时表来处理查询。这种情况一般都需要加索引进行优化。
e.using filesort: mysql使用了外部排序而不是索引排序,数据量小时使用内存排序,数据量大时使用磁盘排序。
f.select tables optimized away:使用某个聚合函数(如:max、min)来查询某个索引字段。

注意:

  • 单个字段索引的最大长度为767字节,如果创建单个字段索引时,索引字段超过767字节,会报“Specified key was too long; max key length is 767 bytes”。

    解决:

    一、改变索引字段大小。

    二、启用innodb_large_prefix参数,索引字段的大小限制值会增加到3072字节。

  • 联合索引的大小限制值为3072字节。但是对于超过767字节的列取左前缀作为索引。在mysql5.5版本,引入了innodb_large_prefix,在mysql5.5版本与mysql5.6版本,innodb_large_prefix默认是关闭的,在5.7及以上版本默认是打开的。在mysql8.0版本中,innodb_large_prefix已被移除,从版本8.0开始,索引长度限制由表字段(row format)决定,若为dynamic或compressed时,限制值为3072。若为compact或redundant时,限制值为767。

explain分析的更多相关文章

  1. mysql优化(三)–explain分析sql语句执行效率

    mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐 ...

  2. explain分析查询

    参考以下文章,在此非常感谢原作者 explain分析查询

  3. Mysql explain分析SQL语句之字段属性说明

    在 explain的帮助下,您就知道什么时候该给表添加索引,以使用索引来查找记录从而让select 运行更快.如果由于不恰当使用索引而引起一些问题的话,可以运行 analyze table来更新该表的 ...

  4. SQL 语句 explain 分析

      分析索引的效率: > EXPLAIN sql; EXPLAIN 分析的结果的表头如下: id | select_type | table | partitions | type | poss ...

  5. Mysql explain分析sql语句执行效率

    mysql优化–explain分析sql语句执行效率 Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 ...

  6. MySQL单列索引和组合索引的选择效率与explain分析

    一.先阐述下单列索引和组合索引的概念: 单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引. 组合索引:即一个索包含多个列. 如果我们的查询where条件只有一个,我们完全可 ...

  7. MySql 使用explain分析查询

    今天写了个慢到哭的查询,想用explain分析下执行计划,后来发现explain也是有局限性的: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义函数对查询的影响情况 •EXPLAIN不 ...

  8. MySQL的explain分析sql语句

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

  9. SQL优化(三)—— 索引、explain分析

    SQL优化(三)—— 索引.explain分析   一.什么是索引 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的查询数据 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据 ...

  10. (2)MySQL进阶篇SQL优化(show status、explain分析)

    1.概述 在应用系统开发过程中,由于初期数据量小,开发人员写SQL语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SQL语句开始逐渐显露出性能问题,对生产环境的影响也 ...

随机推荐

  1. 物体三维模型的构建:3DSOM软件实现侧影轮廓方法

      本文介绍基于3DSOM软件,实现侧影轮廓方法的空间三维模型重建. 目录 1 背景知识 1.1 三维信息获取方法 1.2 侧影轮廓方法原理及其流程 2 三维模型制作 2.1 马铃薯三维模型制作 2. ...

  2. JavaSript 数组

    添加数组 push是添加在数组的末位,unshift是添加在首位 let arr= ['a','b','c'] arr.push('d') arr.unshift('E')

  3. 数据结构与算法 | 图(Graph)

    在这之前已经写了数组.链表.二叉树.栈.队列等数据结构,本篇一起探究一个新的数据结构:图(Graphs ).在二叉树里面有着节点(node)的概念,每个节点里面包含左.右两个子节点指针:比对于图来说同 ...

  4. BIRCH算法全解析:从原理到实战

    本文全面解析了BIRCH(平衡迭代削减聚类层次)算法,一种用于大规模数据聚类的高效工具.文章从基础概念到技术细节,再到实战应用与最佳实践,提供了一系列具体的指导和例子.无论你是数据科学新手,还是有经验 ...

  5. SpringMvc集成开源流量监控、限流、熔断降级、负载保护组件Sentinel

    前言:作者查阅了Sentinel官网.51CTO.CSDN.码农家园.博客园等很多技术文章都没有很准确的springmvc集成Sentinel的示例,因此整理了本文,主要介绍SpringMvc集成Se ...

  6. Go切片是值传递还是引用传递?

    Go没有引用传递和引用类型!!! 很多人有个误区,认为涉及Go切片的参数是引用传递,或者经常听到Go切片是引用类型这种说法,今天我们就来说一下方面的问题. 什么是值传递? 将实参的值传递给形参,形参是 ...

  7. 基于.NET Core + Quartz.NET+ Vue + IView开箱即用的定时任务UI

    前言 定时任务调度应该是平时业务开发中比较常见的需求,比如说微信文章定时发布.定时更新某一个业务状态.定时删除一些冗余数据等等.今天给大家推荐一个基于.NET Core + Quartz.NET + ...

  8. Gradle导致Lombok不生效问题

    现象 从debug看是可以查询到数据的,但是返回起前端是没有数据的 解决办法 // 引入lombok注解处理器 annotationProcessor,不然lombok不会生效 annotationP ...

  9. 解析$nextTick魔力,为啥大家都爱它?

    1.为什么需要使用$nextTick? 首先我们来看看官方对于$nextTick的定义: 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 由于vu ...

  10. ezbypass-cat【目录穿透】

    ezbypass-cat[目录穿透][难度:4] 题目界面 尝试SQL注入无果,看题解发现是目录穿透,需要抓包才能得到flag. 解题步骤 随便输入用户名和密码抓包 更改请求方式(POST→GET), ...