explain分析
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分析的更多相关文章
- mysql优化(三)–explain分析sql语句执行效率
mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐 ...
- explain分析查询
参考以下文章,在此非常感谢原作者 explain分析查询
- Mysql explain分析SQL语句之字段属性说明
在 explain的帮助下,您就知道什么时候该给表添加索引,以使用索引来查找记录从而让select 运行更快.如果由于不恰当使用索引而引起一些问题的话,可以运行 analyze table来更新该表的 ...
- SQL 语句 explain 分析
分析索引的效率: > EXPLAIN sql; EXPLAIN 分析的结果的表头如下: id | select_type | table | partitions | type | poss ...
- Mysql explain分析sql语句执行效率
mysql优化–explain分析sql语句执行效率 Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 ...
- MySQL单列索引和组合索引的选择效率与explain分析
一.先阐述下单列索引和组合索引的概念: 单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引. 组合索引:即一个索包含多个列. 如果我们的查询where条件只有一个,我们完全可 ...
- MySql 使用explain分析查询
今天写了个慢到哭的查询,想用explain分析下执行计划,后来发现explain也是有局限性的: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义函数对查询的影响情况 •EXPLAIN不 ...
- MySQL的explain分析sql语句
explain分析查询 使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的.这可以帮你分析你的查询语句或是表结构的性能瓶颈.通过explain命 ...
- SQL优化(三)—— 索引、explain分析
SQL优化(三)—— 索引.explain分析 一.什么是索引 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的查询数据 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据 ...
- (2)MySQL进阶篇SQL优化(show status、explain分析)
1.概述 在应用系统开发过程中,由于初期数据量小,开发人员写SQL语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SQL语句开始逐渐显露出性能问题,对生产环境的影响也 ...
随机推荐
- 2007年对Youtube小视频的分析文章
Understanding the Characteristics of Internet Short Video Sharing: YouTube as a Case Study 视频的种类 该研究 ...
- uni-app框架开发app发布流程
uni-app框架开发app发布流程 1.首先公司申请软著 步骤:申请软著详细流程 - 阿长*长 - 博客园 (cnblogs.com) 一.安卓端 1,点击发行>原生-app云打包 正式包和自 ...
- 时间复杂度为 O(nlogn) 的排序算法
归并排序 归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下: 划分:分解待排序的 n 个元素的 ...
- 聊聊分布式 SQL 数据库Doris(九)
优化器的作用是优化查询语句的执行效率,它通过评估不同的执行计划并选择最优的执行计划来实现这一目标. CBO: 一种基于成本的优化器,它通过评估不同查询执行计划的成本来选择最优的执行计划.CBO会根据数 ...
- Gradio-Lite: 完全在浏览器里运行的无服务器 Gradio
Gradio 是一个经常用于创建交互式机器学习应用的 Python 库.在以前按照传统方法,如果想对外分享 Gradio 应用,就需要依赖服务器设备和相关资源,而这对于自己部署的开发人员来说并不友好. ...
- 如何理解微服务体系结构中的 CQRS
本文翻译自 How To Understand CQRS In Microservices Architecture,原作者 OLEKSII. 问题描述 在典型的软件应用程序中,有一个负责写入和读取操 ...
- freeswitch如何解决sip信令的NAT问题
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 公网环境复杂多变,客户环境更是各种稀奇古怪的问题. fs在针对sip信令的NAT问题有针对性的参数设置. 本文讨论的范围限于fs的公 ...
- [USACO2007OPEN S] Catch That Cow S
题目描述 FJ丢失了他的一头牛,他决定追回他的牛.已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动.FJ的行走方式很特别:他每一次可以前进一步.后退一步或者直接走到2*x的位置.计算他 ...
- MySQL运维3-分库分表策略
一.介绍 单库瓶颈:如果在项目中使用的都是单MySQL服务器,则会随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行存储,存在一下性能瓶颈: IO瓶颈:热点数据太多,数 ...
- 开源地图库OpenLayers的简单使用
引言 最近在学习可视化的东西,这让我想起了一些以前用过的图表库,其实我在日常做的大多是普通的需求,可视化方面应用的并不多,只是偶尔会因为个别特殊的需求,去借助一些图表库来实现图表的展示,这些普通的图表 ...