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. 2007年对Youtube小视频的分析文章

    Understanding the Characteristics of Internet Short Video Sharing: YouTube as a Case Study 视频的种类 该研究 ...

  2. uni-app框架开发app发布流程

    uni-app框架开发app发布流程 1.首先公司申请软著 步骤:申请软著详细流程 - 阿长*长 - 博客园 (cnblogs.com) 一.安卓端 1,点击发行>原生-app云打包 正式包和自 ...

  3. 时间复杂度为 O(nlogn) 的排序算法

    归并排序 归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下: 划分:分解待排序的 n 个元素的 ...

  4. 聊聊分布式 SQL 数据库Doris(九)

    优化器的作用是优化查询语句的执行效率,它通过评估不同的执行计划并选择最优的执行计划来实现这一目标. CBO: 一种基于成本的优化器,它通过评估不同查询执行计划的成本来选择最优的执行计划.CBO会根据数 ...

  5. Gradio-Lite: 完全在浏览器里运行的无服务器 Gradio

    Gradio 是一个经常用于创建交互式机器学习应用的 Python 库.在以前按照传统方法,如果想对外分享 Gradio 应用,就需要依赖服务器设备和相关资源,而这对于自己部署的开发人员来说并不友好. ...

  6. 如何理解微服务体系结构中的 CQRS

    本文翻译自 How To Understand CQRS In Microservices Architecture,原作者 OLEKSII. 问题描述 在典型的软件应用程序中,有一个负责写入和读取操 ...

  7. freeswitch如何解决sip信令的NAT问题

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 公网环境复杂多变,客户环境更是各种稀奇古怪的问题. fs在针对sip信令的NAT问题有针对性的参数设置. 本文讨论的范围限于fs的公 ...

  8. [USACO2007OPEN S] Catch That Cow S

    题目描述 FJ丢失了他的一头牛,他决定追回他的牛.已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动.FJ的行走方式很特别:他每一次可以前进一步.后退一步或者直接走到2*x的位置.计算他 ...

  9. MySQL运维3-分库分表策略

    一.介绍 单库瓶颈:如果在项目中使用的都是单MySQL服务器,则会随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行存储,存在一下性能瓶颈: IO瓶颈:热点数据太多,数 ...

  10. 开源地图库OpenLayers的简单使用

    引言 最近在学习可视化的东西,这让我想起了一些以前用过的图表库,其实我在日常做的大多是普通的需求,可视化方面应用的并不多,只是偶尔会因为个别特殊的需求,去借助一些图表库来实现图表的展示,这些普通的图表 ...