前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数栈技术分享:解读MySQL执行计划的type列和extra列

数栈技术分享:解读MySQL执行计划的type列和extra列

原创
作者头像
袋鼠云数栈
修改于 2021-06-04 02:21:24
修改于 2021-06-04 02:21:24
3.1K0
举报
文章被收录于专栏:数栈技术分享数栈技术分享

一、解读type

执行计划的type表示访问数据类型,有很多种访问类型。

1、system 表示这一步只返回一行数据,如果这一步的执行对象是一个驱动表或者主表,那么被驱动表或者子查询只是被访问一次。

2、const

表示这个执行步骤最多只返回一行数据。const通常出现在对主键或唯一索引的等值查询中,例如对表t主键id的查询:

3、eq_ref

eq_ref类型一般意味着在表关联时,被关联表上的关联列走的是主键或者唯一索引。例如,表jiang关联lock_test表,关联列分别是两张表的主键列 :

上面SQL执行时,jiang表是驱动表,lock_test是被驱动表,被驱动表的关联列是主键id,type类型为eq_ref。

所以,对于eq_ref类型来说有一个重要的特点就是:这一步涉及到的表是被驱动表;这一步中使用到唯一索引或主键。除了system和const之外,这是效果最好的关联类型。

4、ref

与上面相反,如果执行计划的某一步的type是ref的话,表示这一步的关联列是非唯一索引。例如,用表jiang的主键id列关联表lock_test的num列,num列上建立了普通索引:

上面SQL执行时,表jiang是驱动表,lock_test是被驱动表,被驱动表上走的是非唯一索引,type类型为ref。

所以ref的特点是:表示这一步访问数据使用的索引是非唯一索引。

5、Ref_or_null 例如执行下面语句:

表示走了索引(num列上有索引),但是也访问了空值。

6、index_merge

表示索引合并,一般对多个二级索引列做or操作时就会发生索引合并。 例如执行下列语句: mysql> explain select * from lock_test where id=3 or num=4;

id为主键,num列上建有普通索引,语句执行时,会通过两个单列索引来处理or操作。

7、unique_subquery 表示唯一子查询。例如有如下语句执行时: value in(select primary_key from single_table where ...) 对于in子句来说,当in子句里的子查询返回的是某一个表的主键时,type显示为unique subquery。

8、index_subquery 当有如下语句执行时: value in(select key_column from single_table where ...) 与上面的相似,表示对于in子句来说,当in子句里的子查询返回的是某一个表的二级索引列(非主键列)时,type显示为index_subquery。

9、range: 在有索引的列上取一部分数据。常见于在索引列上执行between and操作。

10、index: 索引全扫描,一般发生在覆盖索引的时候,也就是对有索引列发生一次全扫描。

11、all: 没有索引的全表扫描。 一个特例:

Explain select * from stu limit 1,1;

二、解读extra

1、using where: 一般有两层意思: 表示通过索引访问时,需要再回表访问所需的数据; 过滤条件发生在server层而不是存储引擎层; 如果执行计划中显示走了索引,但是rows值很高,extra显示为using where,那么执行效果就不会很好。因为索引访问的成本主要在回表上,这时可以采用覆盖索引来优化。 通过覆盖索引也能将过滤条件下压,在存储引擎层执行过滤操作,这样效果是最好的。 所以,覆盖索引是解决using where的最有效的手段。

2、using index condition 表示将过滤下压到存储层执行,防止server层过滤过多数据 如果extra中出现了using index condition,说明对访问表数据进行了优化。

3、using temporary 表示语句执行过程中使用到了临时表。以下子句的出现可能会使用到临时表: order by group by distinct union等 数据不能直接返回给用户,就需要缓存,数据就以临时表缓存在用户工作空间。注意,可能会出现磁盘临时表,需要关注需要缓存的数据的rows。 可以使用索引消除上面的四个操作对应的临时表。

4、using sort_union(indexs) 比如当执行下面语句:

Sname和sphone列上都有索引,这时执行计划的extra项就会显示using sort_union(i_sname,i_spone),表示索引合并。常伴随着index_merge。

5、using MRR: 一般通过二级索引访问表数据的过程是:先访问二级索引列,找到对应的二级索引数据后就得到对应的主键值,然后拿着这个主键值再去访问表,取出行数据。这样取出的数据是按照二级索引排序的。 MRR表示:通过二级索引得到对应的主键值后,不直接访问表而是先存储起来,在得到所有的主键值后,对主键值进行排序,然后再访问表。这样可以大幅减低对表的访问次数,至少实现了顺序访问表。 MRR的一个优点就是提升索引访问表的效率,也就是降低了回表的成本。但是有一个比较大的问题:取出来的数据就不按照二级索引排序了。

6、using join buffer(Block Nested Loop) BNL主要发生在两个表关联时,被关联的表上没有索引。 BNL表示这样的意思:A关联B,A的关联列上有索引而B的没有。这时就会从A表中取10行数据拿出来放到用户的join buffer空间中,然后再取B上的数据和join buffer中A的关联列进行关联,这时只需要对B表访问一次,也就是B表发生一次全表扫描。 如果join buffer中的10行数据关联完后,就再取10行数据继续和B表关联,一直到A表的所有数据都关联完为止。 从上面可以看出来,这种方式大概效率会提高约90%。

7、using join buffer(Batched Key Access) 一般出现BKA的情况是:表关联时,被驱动表上有索引,但是驱动表返回的行数太多。 当出现上述情况时,就会将驱动表的返回结果集放到用户工作空间的join buffer中,然后取结果集的一条记录去关联被驱动表的索引关联列。得到相应的主键列后并不马上通过这个主键列去被被驱动表中取数据,而是先存放到工作空间中。等到结果集中的所有数据都关联完了,对工作空间中的所有通过关联得到主键列进行排序,然后统一访问被驱动表,从中取数据。这样的好处就是大大降低了访问的次数。 从上面可以看出:BKA用到了MRR技术;BKA适合驱动表返回行数较多、被驱动表访问时走的是索引的情况。 这个功能可以打开或者关闭: Set optimizer_switch=’mrr=on,batched_key_access=on’;

8、using index for group by 表示通过复合索引完成group by,不用回表。 例如复合索引(a,b),执行语句:select a from tb group by b;时就会出现using index for group by。

9、using index

表示实现了覆盖索引扫描;也就是需要访问的数据都在索引中,不需要回表。在一般情况下,减少不必要的数据访问能够提升效率。

例如对表lock_test取num列上的数据,num列上建立普通索引:

10、using filesort 说明有排序行为,但是不一定是磁盘排序。

11、materialize scan 对物化表的全扫描,因为物化表就是一个临时表,表上没有索引。

数栈是云原生—站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变化的数据,是全域、异构、批流一体的数据同步引擎。大家喜欢的话请给我们点个star!star!star!

github开源项目:https://github.com/DTStack/flinkx

gitee开源项目:https://gitee.com/dtstack_dev_0/flinkx

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
谢谢分享啦
谢谢分享啦
回复回复点赞举报
推荐阅读
nginx正向代理配置详解
nginx不仅可以做反向代理,还能用作正向代理来进行上网等功能。如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理(也就是大家常说的,通过正向代理进行上网功能)
随心助手
2019/10/15
58.4K0
基于CentOS 7配置Nginx正向代理
Nginx是一款以轻量级、低内存开销、支持缓存、支持反向代理,负载均衡,电子邮件服务而著称。对于鲜为人知的是,它还可以作为一个简单易用的正向代理服务器。
院长技术
2021/01/08
9450
基于CentOS 7配置Nginx正向代理
Nginx是一款以轻量级、低内存开销、支持缓存、支持反向代理,负载均衡,电子邮件服务而著称。对于鲜为人知的是,它还可以作为一个简单易用的正向代理服务器。本文简要描述这个正向代理功能并给出演示,供大家参考。
Leshami
2018/08/06
2.3K0
Nginx正向代理
记一次使用Nginx做正向代理,实现http与https的代理访问 1.环境介绍 操作系统:CentOS Linux release 7.6.1810 (Core) Nginx编译安装,版本-nginx/1.18.0 服务器A部署在DMZ区域且可上网,服务器B不可上网,但是和服务器A能够通信 在服务器A上部署Nginx正向代理,使服务器B通过服务器A正向代理功能可访问http和https Nginx默认不支持https的正向代理,这里需要安装第三方模块“ngx_http_proxy_connect_modu
染指流年
2023/03/13
9820
基于CentOS 7配置Nginx反向代理
Nginx作为反向代理服务器被广泛使用在各大互联网企业。它简单易用,可以根据业务的需求将其不同的业务类型代理至不同的服务器,将整个站点请求压力按类型分摊到不同的服务器。该方式使的整个站点请求性能得以极大的提升。本文简要描述了Nginx几种不同情形的代理演示,供大家参考。
Leshami
2018/08/06
2.2K0
基于CentOS 7配置Nginx反向代理
CDN-COS常见跨域问题汇总
前端开发在使用CDN-COS产品时,经常会遇到应用上的跨域访问,腾讯云COS和CDN两款产品都可以自主设置跨域响应头,但又有一些差异,本文介绍一下常见的访问失败的问题和验证方式。
wainsun
2020/09/14
4.7K0
tengine、nginx配置正向代理,其他内网机器通过代理访问外网,支持https
PCRE(Perl Compatible Regular Expressions)是一个 Perl 库,包括 perl 兼容的正则表达式库。nginx rewrite 依赖于 PCRE 库,所以在安装 Tengine 前一定要先安装 PCRE。
joshua317
2022/03/29
3K0
tengine、nginx配置正向代理,其他内网机器通过代理访问外网,支持https
CDN-COS常见跨域问题汇总
前端开发在使用CDN-COS产品时,经常会遇到应用上的跨域访问,腾讯云COS和CDN两款产品都可以自主设置跨域响应头,但又有一些差异,本文介绍一下常见的访问失败的问题和验证方式。
wainsun
2021/02/23
3K0
CDN-COS常见跨域问题汇总
Nginx 正向代理 http、https(openEuler)
Nginx正向代理,通过服务器代理客户端去重定向请求访问到目标服务器的一种代理服务。对于目标服务器来说浏览器/客户端是隐藏的。Nginx 正向代理默认只支持http 协议,不支持 https 协议,需借助"ngx_http_proxy_connect_module"模块实现https 正向代理。
Kevin song
2024/03/21
3K0
Nginx 正向代理 http、https(openEuler)
nginx--❤️图解及代码实现正向代理、反向代理、负载均衡❤️
在实现nginx正向代理之前,先说明一下,现在的网站基本上都是https,因此要实现nginx正向代理转发请求,除了要配置转发http80端口的请求,还有配置https443端口的请求~
用户4396583
2024/07/25
1.3K0
Nginx专辑|05 -如何使用Nginx配置正向代理
在之前的编译nginx的基础上,我们对nginx二进制增加新的模块ngx_http_proxy_connect_module[1]
公众号: 云原生生态圈
2020/08/04
3K0
Nginx专辑|05 -如何使用Nginx配置正向代理
腾讯云SCF + 腾讯云API网关实现跨域
跨来源资源共享(Cross-Origin Resource Sharing(CORS))是一种使用额外 HTTP 标头来让目前浏览网站的 user agent 能获得访问不同来源(网域)服务器特定资源之权限的机制。当 user agent 请求一个不是目前文件来源——来自于不同网域(domain)、通信协定(protocol)或通信端口(port)的资源时,会建立一个跨来源HTTP请求(cross-origin HTTP request)。
孔令飞
2019/11/01
17.5K1
腾讯云SCF + 腾讯云API网关实现跨域
什么是正向代理以及使用nginx作为正向代理服务器
正向代理(Forward Proxy)是代理服务器的一种使用方式,主要是为了保护客户端,客户端通过代理服务器向目标服务器发起请求,代理服务器接收到请求后将请求转发给目标服务器,并将响应返回给客户端。
玖叁叁
2023/04/11
2.8K0
golang源码分析:http代理和https代理
首先还是上代码:https://github.com/xiazemin/dns_proxy,然后我们思考几个问题:我们使用charles抓包的时候使用的是https代理还是http代理?使用charles代理的时候为什么要装charles的证书,有什么作用?http代理能代理https的请求么?
golangLeetcode
2022/12/17
5440
curl 用法简介
curl 是一个命令行客户端,支持多种传输协议,最经常使用的场景就是在终端请求服务器资源。
后端码匠
2022/01/18
1.9K0
curl 用法简介
nginx正向代理配置
Nginx是一个高性能的Web服务器,也可以作为反向代理和正向代理服务器使用。本文将介绍如何使用Nginx作为正向代理服务器,并提供相关的配置示例。
堕落飞鸟
2023/03/31
2.3K0
正向代理和反向代理
代理按主要服务的角色分成2种,正向代理和反向代理,正向代理代理的是客户端,反向代理代理的是服务器。典型拓扑结构如下:
数据小冰
2022/08/15
5460
正向代理和反向代理
了解HTTP的基本历史及知识
上世纪九十年代前,互联网还没有被发明出来,那时候的网络基本以发邮件(Email1965年发明)等形式简单实用
CRMEB商城源码
2022/04/29
4970
了解HTTP的基本历史及知识
Linux curl支持http/https方法,Curl请求示例语法
Curl请求示例 curl -X GET "http://<host:port>/api/1/test/get?test=<value>&app_id=<app_id>&sign=<sign>&timestamp=<timestamp>" curl -X POST -H "Content-Type: application/json" -d '{"test1":"hah","test2":"qwe","test3":"111"}' "http://<host:port>/api/1/test/post2?test=<value>&app_id=<app_id>&sign=<sign>&timestamp=<timestamp>"
oktokeep
2024/10/09
1660
golang 实现HTTP代理和反向代理
代理的核心功能可以用一句话概括:接受客户端的请求,转发到后端服务器,获得应答之后返回给客户端。下图是 《HTTP 权威指南》一书中给出的图例,可以很清晰地说明这一流程:
全栈程序员站长
2022/09/13
2.4K0
golang 实现HTTP代理和反向代理
相关推荐
nginx正向代理配置详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档