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语句开始逐渐显露出性能问题,对生产环境的影响也 ...
随机推荐
- 题解 CF690C1
题目大意: 给定一张 \(n\) 个点 \(m\) 条边的无向图,判断这是不是一棵树. 题目分析: 两种思路: 思路一: 不需要建图,直接使用并查集判环即可 最后判断一下图联不联通就行,具体方法就是看 ...
- JuiceFS 用户必备的 6 个技巧
随着大数据.AI 技术的发展,越来越多的企业.团队和个人开始使用 JuiceFS,本文整理了 6 个超实用的 JuiceFS 技巧,帮助大家提升 JuiceFS 的管理效率. 一.查看已挂载的文件系统 ...
- .NET领域性能最好的对象映射框架Mapster使用方法
Mapster是一个开源的.NET对象映射库,它提供了一种简单而强大的方式来处理对象之间的映射.在本文中,我将详细介绍如何在.NET中使用Mapster,并提供一些实例和源代码. 和其它框架性能对比: ...
- mysql 安装避坑指南 ,mysql 安装后不能启动, mysql 指定版本安装,mysql 5.7.39版本安装,mysql 5.7.36版本安装
mysql 安装后不能启动,报错如下:请参照本说明第7条的办法解决.mysqld.service: Control process exited, code=exited status=1Please ...
- Codeforces Round 894 (Div. 3)
Codeforces Round 894 (Div. 3) A. Gift Carpet 题意:判断一列一个字母有没有"vika" 思路:挨个枚举每一列 #include<b ...
- 小程序的登录授权与退出功能(wx.getUserProfile)
一.授权登录:wx.getUserProfile 1.使用wx.getUserProfile实现登录 1.javascript: login(){ wx.getUserProfile({ desc: ...
- win32 API 文件夹操作函数整理
常用操作文件目录的函数 1. CreateDirectory 创建文件夹 原型: BOOL CreateDirectory( LPCTSTR lpPathName, LPSECURITY_ATTRIB ...
- [ABC261C] NewFolder(1)
Problem Statement For two strings $A$ and $B$, let $A+B$ denote the concatenation of $A$ and $B$ in ...
- Chrome扩展的核心:manifest 文件(中)
大家好,我是 dom 哥.我正在写关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星 . 在上一篇中已经完成了 Chrome 扩展的雏形,本篇接着介绍 manifest 中的可选字段,完 ...
- SpringBoot整个RabbitMQ详细~
搭建环境 1.安装RabbitMQ,我是用的是Docker方式安装的,大家根据个人习惯自行安装哈 docker run -d -p 5672:5672 -p 15672:15672 --name ra ...