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语句开始逐渐显露出性能问题,对生产环境的影响也 ...
随机推荐
- Redis 哨兵模式的原理及其搭建
1.Redis哨兵 Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复. 1.1.哨兵原理 1.1.1.集群结构和作用 哨兵的结构如图: 哨兵的作用如下: 监控:Sentinel ...
- Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍
Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍 目录 Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍 一.前置原则 二.一切皆组合 2.1 一切皆组合 2.2 垂直组合 2.2.1 第 ...
- tableau用数值呈现条形图的总计
创建计算字段 创建计算字段:销售额总计,键入函数: IF Size()=1 THEN 0 ELSE Sum([销售额]) END 创建视图 将度量"销售额"拖放至列,将维度&quo ...
- offline RL | Pessimistic Bootstrapping (PBRL):在 Q 更新中惩罚 uncertainty,拉低 OOD Q value
论文题目:Pessimistic Bootstrapping for Uncertainty-Driven Offline Reinforcement Learning,ICLR 2022,6 6 8 ...
- 华企盾DSC苹果电脑右键菜单不显示问题
1.检查认证的用户是否给了对应的权限(如:手动加密.手动解密.申请解密) 2.系统偏好设置--键盘--快捷键中开通的权限是否有勾选 3.系统服务中允许的菜单数超出了最大值
- 华企盾DSC手机app注册保存成功登录时一直转圈
可能是花生壳等映射软件不稳定,重启一下花生壳等工具
- IDEA插件(2 高效开发)
一.高效开发代码插件 ① .TONGYI Lingma(阿里通灵代码AI插件) 提问回答 右键其他功能,只需要登录阿里账号就可以使用 ②.Talk X(AI提示插件,和阿里通灵代码很像的功能) ③.A ...
- STM32CubeMX教程3 GPIO输入 - 按键响应
1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 2 ...
- Centos7——防火墙(Firewall)命令
centos防火墙根据系统大致有2种,一种是centos6时代的iptables:一种是centos7时代的firewalld: CentOS 7中防火墙是一个非常的强大的功能,在CentOS 6.5 ...
- history详解
linux下history命令详解 如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的 15 个用法. ...