我的编程空间,编程开发者的网络收藏夹
学习永远不晚

3. select语句执行过程-优化器

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

3. select语句执行过程-优化器

3. select语句执行过程-优化器

1.有哪些

2.开启追踪

优化器追踪默认是关闭的

2.1 开启

SHOW VARIABLES LIKE "optimizer_trace";

set optimizer_trace="enabled=on";

2.2 执行一个sql后查询计划

select * from information_schema.optimizer_trace

它是一个 JSON 类型的数据,主要分成三部分,准备阶段、优化阶段和执行阶段。

  • expanded_query 是优化后的 SQL 语句。
  • considered_execution_plans 里面列出了所有的执行计划。

2.3 关闭

开启这开关是会消耗性能的,因为它要把优化分析的结果写到表里面,所以不要轻易开启

set optimizer_trace="enabled=off";
SHOW VARIABLES LIKE "optimizer_trace";

3.分析查询计划 [2] [3]

3.1 命令

常用命令

explain select ...

将表格形式的执行计划转化成 select语句

explain extended select ...

3.2 结果说明

3.2.1 id

有一组数字组成。表示一个查询中各个子查询的执行顺序;

  • id相同执行顺序由上至下。
  • id不同,id值越大优先级越高,越先被执行。
  • id为null时表示一个结果集,不需要使用它查询,常出现在包含union等查询语句中。

3.2.2 select_type

序号 类型 描述
1 SIMPLE 不包含任何子查询或union等查询
2 PRIMARY 包含子查询最外层查询就显示为 PRIMARY
3 SUBQUERY 在select或 where子句中包含的查询
4 DERIVED from字句中包含的查询
5 UNION 出现在union后的查询语句中
6 UNION RESULT 从UNION中获取结果集

3.2.3 table

查询的数据表,当从衍生表中查数据时会显示 derivedx x 表示对应的执行计划id。

3.2.4 partitions

表分区、表创建的时候可以指定通过那个列进行表分区。

3.2.5 type(以下基本性能从低到高排列,数越小性能越高)

  • ALL 扫描全表数据 9
  • index 遍历索引 8
  • range 索引范围查找 7
  • index_subquery 在子查询中使用 ref
  • unique_subquery 在子查询中使用 eq_ref
  • ref_or_null 对Null进行索引的优化的 ref 6
  • fulltext 使用全文索引
  • ref 使用非唯一索引查找数据 5

ref类型还经常会出现在join操作中: 表关联查询时必定会有一张表进行全表扫描,此表一定是几张表中记录行数最少的表,然后再通过非唯一索引寻找其他关联表中的匹配行,以此达到表关联时扫描行数最少。

  • eq_ref 在join查询中使用PRIMARY KEY or UNIQUE NOT NULL索引关联。4

  • const 使用主键或者唯一索引,且匹配的结果只有一条记录。3

  • system const 连接类型的特例,查询的表为系统表。2

  • NULL,MySQL不用访问表或者索引,直接就能够得到结果 1 如 select 1 from dual

3.2.6 possible_keys

可能使用的索引,注意不一定会使用。查询涉及到的字段上若存在索引,则该索引将被列出来。当该列为 NULL时就要考虑当前的SQL是否需要优化了。

3.2.7 key

显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。 PS:查询中若使用了覆盖索引(覆盖索引:索引的数据覆盖了需要查询的所有数据),则该索引仅出现在key列表中

3.2.8 key_length

索引长度 char()、varchar()索引长度的计算公式:

(Character Set:utf8mb4=4,utf8=3,gbk=2,latin1=1) * 列长度 + 1(允许null) + 2(变长列)
varchar: 编码为utf8mb4,列长为128,不允许为NULL,字段类型为varchar(128)。key_length = 128 * 4 + 0 + 2 = 514;
int类型占4位,允许null,索引长度为5。

3.2.9 ref

表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

3.2.10 rows

返回估算的结果集数目,并不是一个准确的值。

3.2.11 extra

extra的信息非常丰富,常见的有:

  1. Using index 使用覆盖索引 ,不会回表查询
  2. Using where 使用了用where子句来过滤结果集
  3. Using filesort 使用文件排序,使用非索引列进行排序时出现,非常消耗性能,尽量优化。
  4. Using temporary 使用了临时表
  5. Using Index Condition 表示进行了ICP优化

ICP(Index Condition Pushdown)

Pushdown表示操作下放,某些情况下的条件过滤操作下放到存储引擎。

EXPLAIN SELECT * FROM rental WHERE rental_date="2005-05-25" AND customer_id>=300 AND customer_id<=400;

在5.6版本之前:

优化器首先使用复合索引idx_rental_date过滤出符合条件rental_date="2005-05-25"的记录,然后根据复合索引idx_rental_date回表获取记录,最终根据条件customer_id>=300 AND customer_id<=400过滤出最后的查询结果(在服务层完成)。

在5.6版本之后:MySQL使用了ICP来进一步优化查询,在检索的时候,把条件customer_id>=300 AND customer_id<=400也推到存储引擎层完成过滤,这样能够降低不必要的IO访问。Extra为Using index condition就表示使用了ICP优化

注意 Explain 的结果也不一定最终执行的方式。

参考资料

  • 1.https://mp.weixin.qq.com/s/PEk97JyIlUexuAjFr2pmiw
  • 2.https://juejin.im/post/5a52386d51882573443c852a
  • 3.https://juejin.im/post/5b63ac5d5188251b1e1fea0f
  • 4.https://www.cnblogs.com/huchong/p/10235260.html
  • 5.https://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

3. select语句执行过程-优化器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

3. select语句执行过程-优化器

1.有哪些2.开启追踪优化器追踪默认是关闭的2.1 开启SHOW VARIABLES LIKE "optimizer_trace";set optimizer_trace="enabled=on";2.2 执行一个sql后查询计划select * from i
3. select语句执行过程-优化器
2019-02-28

1. select语句执行过程-网络通信

执行过程图网络通信MySQL 是支持多种通信协议的,可以使用同步/异步的方式,支持长连接/短连接。1.同步/异步异步的问题异步可以避免应用阻塞等待,但是不能节省 SQL 执行的时间。如果异步存在并发,每一个 SQL 的执行都要单独建立一个连接,避免数据混乱。线
1. select语句执行过程-网络通信
2015-06-19

sql语句执行过慢如何优化

优化 SQL 语句的执行速度可以采取以下几种方法:1. 索引优化:确保表的关键字段上创建了正确的索引,以加快查询速度。可以使用 EXPLAIN 关键字来查看 SQL 语句的执行计划,并根据执行计划来优化索引。2. 避免全表扫描:尽量避免在
2023-08-19

Mysql查询语句执行过程 - G

Mysql查询语句执行过程 Mysql分为server层和存储引擎两部分,或许可以再加一层连接层 连接层(器)Mysql使用的是典型的C/S架构。连接器通过典型的TCP握手完成连接。需要注的是,如果用户名和密码都正确,那么该连接所拥有的权限仅仅是连接成功建立时
Mysql查询语句执行过程 - G
2021-12-15

2 select语句执行过程-缓存& 语法解析和预处理(Parser & Preprocessor)

1.缓存MySQL 的缓存默认是关闭的,8.0直接去掉了缓存模块show variables like "query_cache%"2.语法解析从这个最简单的sql语句说起select name from user_info where id = 1; and
2 select语句执行过程-缓存& 语法解析和预处理(Parser & Preprocessor)
2015-12-23

Postgresql开启SQL执行语句收集过程

修改配置文件1.打开PostgreSQL配置文件,如:C:\Program Files\PostgreSQL\14\data\postgresql.conf2.修改如下,如果字段被#注释,则去掉#log_directowww.lsjlt
Postgresql开启SQL执行语句收集过程
2024-10-14

MySql中sql语句执行过程是什么

今天小编给大家分享一下MySql中sql语句执行过程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。sql语句的执行过程
2023-07-05

java switch语句的执行过程是什么

这篇文章主要介绍“java switch语句的执行过程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java switch语句的执行过程是什么”文章能帮助大家解决问题。1、语法switch(常
2023-06-30

MySQL执行一条查询语句的过程

执行流程如下图所示,我们可以看到当向 MySQL 发送一个请求时,MySQL 到底做了什么: 客户端发送一条査询给服务器。服务器先检查査询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进人下一阶段。服务器端进行 SQL 解析、预处理,再由优化器生成对
MySQL执行一条查询语句的过程
2018-04-18

详解MySQL 查询语句的执行过程

首先先简单的将一个查询语句背后MySQL做了什么捋一捋:客户端发送一条查询给服务器。服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一个阶段。服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划。MyS
2022-05-19

深入理解:Mysql执行SQL语句过程

开发人员基本都知道,我们的数据存在数据库中(目前最多的是mysql和oracle,由于作者更擅长mysql,所以这里默认数据库为mysql),服务器通过sql语句将查询数据的请求传入到mysql数据库。数据库拿到sql语句以后。都是进行了
2023-06-02

MyBatis的SQL语句执行过程是什么

这篇文章主要介绍“MyBatis的SQL语句执行过程是什么”,在日常操作中,相信很多人在MyBatis的SQL语句执行过程是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyBatis的SQL语句执行过程
2023-06-30

一条SQL语句执行过程时怎样的

本篇内容主要讲解“一条SQL语句执行过程时怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“一条SQL语句执行过程时怎样的”吧!一、MySQL 体系架构- 连接池组件1、负责与客户端的通信,是
2023-06-29

java中switch语句的执行过程是什么

今天就跟大家聊聊有关java中switch语句的执行过程是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编
2023-06-14

编程热搜

目录