MySQL中SELECT语句的执行过程

news2024/11/22 15:06:44

2.1.1. 一条SELECT语句的执行过程

MySQL 的架构共分为两层:Server 层和存储引擎层

  • Server层负责建立连接、分析和执行SQL
  • 存储引擎层负责数据的存储和提取,支持 InnoDB、MyISAM、Memory 等多个存储引擎,MySQL5.5以后默认使用InnoDB,默认索引类型是B+树。
2.1.1.1. 连接器:

MySQL基于TCP协议传输需要经过三次握手,连接后开始验证用户名和密码,通过后获取用户权限。管理员中途修改用户权限不会影响已存在连接的权限,新建立的连接使用修改后的权限。空闲连接超过8小时后会自动断开, kill connection + id命令可以手动断开空闲连接,MySQL支持的最大连接数是151个。

MySQL也有短连接接和长连接的概念

    • 短连接:连接->执行->断开 ......
    • 长连接:连接->执行->执行->执行->......->断开

长连接断开之前一直占用内存,累计太多导致内存占用太多,可能会被系统强制杀掉,造成服务异常。

解决长连接占用内存:

    • 定期断开长连接
    • 客户端主动重置连接,MySQL 5.7 版本实现了 mysql_reset_connection() 函数的接口,在执行一个很大的操作后,通过调用mysql_reset_connection() 函数来重置连接,过程不需要重连和权限验证。
2.1.1.2. 查询缓存:

如果是查询操作,先查询缓存,如果缓存命中直接返回结果给客户端,未命中就向后执行。MySQL 8.0 开始删除了server 层的查询缓存,因为命中率较低。

2.1.1.3. 解析SQL:

SQL语句正式执行前,先由解析器做两件事。

  1. 词法分析:

首先会识别出关键字,例如,SQL语句 select username from userinfo,解析后获得4个token,有两个Keyword分别是select和from。

关键字

非关键字

关键字

非关键字

select

username

from

userinfo

  1. 语法分析:

根据语法规则判断该SQL语句是否满足,通过后会构建语法树,方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。

2.1.1.4. 执行SQL

每条SELECT 查询语句流程主要可以分为下面这三个阶段:

    • prepare 阶段,也就是预处理阶段;
    • optimize 阶段,也就是优化阶段;
    • execute 阶段,也就是执行阶段;
  1. 预处理器:

在这里检查查询语句中的表或者字段是否存在,将select * 中的 *,扩展为表中的所有字段。表或字段如果不存在会在这里报错。

  1. 优化器:

优化器为查询语句指定一个执行计划,例如,表里有多个索引优化器会根据索引基数选择一个较适合的索引。

  1. 执行器:

执行器是真正执行语句的,执行过程会和存储引擎交互,交互以记录为单位。执行过程有三种:

      • 主键索引查询
      • 全表扫描
      • 索引下推

主键索引查询:

  • 执行器第一次查询,调用指向InnoDB引擎索引查询接口的read_first_record 函数指针,然后把条件给存储引擎,来定位符合条件的第一条记录。
  • 存储引擎通过主键索引的 B+ 树结构定位到第一条记录,记录存在,将记录返回给执行器。不存在返回错误然后查询结束;
  • 执行器从存储引擎读到记录后,接着判断记录是否符合查询条件,符合则发送给客户端,如果不符合则跳过该记录。
  • 执行器查询的过程是一个 while 循环,所以还会再查一次,因为不是第一次查询了,会调用 read_record 函数指针指向的函数,如果都查询完了会指向一个永远返回-1的函数,然后退出循环结束查询。

至此,这个语句就执行完成了。

全表扫描:

如果查询语句条件没有使用索引,优化器会决定用全表扫描的方式。

  • 执行器第一次查询,调用指向InnoDB引擎全扫描接口的read_first_record函数指针,让存储引擎读取表中的第一条记录。
  • 执行器判断这条记录是否符合条件,不符合就跳过这一条,符合就将记录发给客户端。(Server 层每从存储引擎读到一条记录就会发送给客户端,之所以客户端显示的时候是直接显示所有记录的,是因为客户端是等查询语句查询完成后,才会显示出所有的记录)
  • 执行器查询的过程是一个 while 循环,所以还会再查一次,接着向存储引擎层要求继续读刚才那条记录的下一条记录,存储引擎把下一条记录取出后就将其返回给执行器(Server层),执行器继续判断条件,不符合查询条件即跳过该记录,否则发送到客户端;
  • 一直重复上述过程,直到存储引擎把表中的所有记录读完,然后向执行器(Server层) 返回了读取完毕的信息;
  • 执行器收到存储引擎报告的查询完毕的信息,退出循环,停止查询。

至此,这个语句就执行完成了。

索引下推:

索引下推能够减少二级索引(基于非主键字段构建的索引)在查询时的回表操作,提高查询的效率,因为它将 Server 层部分负责的事情,交给存储引擎层去处理了。

总结:使用组合索引时,可能会有部分字段无法使用到索引,这时可以使用索引下推来减少回表操作,索引下推就是将所有查询条件都判断完成后再回表,没有使用索引下推就只判断了使用到索引的字段,其余字段的查询条件还需要回到Server层来判断。

组合索引当遇到范围查询 (>、<) 就会停止匹配,也就是 最左侧的字段能用到联合索引,但是后面字段则无法利用到索引

不使用索引下推(MySQL 5.6 之前的版本)时,执行器与存储引擎的执行流程是这样的:

  • Server 层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录,也就是定位到符合最左侧查询条件的第一条记录;
  • 存储引擎根据二级索引的 B+ 树快速定位到这条记录后,获取主键值,然后进行回表操作,将完整的记录返回给 Server 层;
  • Server 层再判断该记录的后续的条件,如果成立则将其发送给客户端;否则跳过该记录;
  • 继续向存储引擎索要下一条记录,存储引擎在二级索引定位到记录后,获取主键值,然后回表操作,将完整的记录返回给 Server 层;
  • 如此往复,直到存储引擎把表中的所有记录读完。

没有索引下推的时候,每查询到一条二级索引记录,都要进行回表操作,然后将记录返回给 Server,接着 Server 再判断该记录是否符合后续的查询条件。

使用索引下推后,判断后续查询条件的工作交给了存储引擎层,过程如下 :

  • Server 层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录,也就是定位符合最左侧查询条件的第一条记录;
  • 存储引擎定位到二级索引后,先不执行回表操作,而是先判断一下该索引中包含的查询条件是否成立。如果条件不成立,则直接跳过该二级索引。如果成立,则执行回表操作,将完成记录返回给 Server 层。
  • Server 层再判断其他的查询条件是否成立,如果成立则将其发送给客户端;否则跳过该记录,然后向存储引擎索要下一条记录。
  • 如此往复,直到存储引擎把表中的所有记录读完。

如果执行计划里的 Extr 部分显示了 “Using index condition”,说明使用了索引下推。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1634564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是DDoS攻击?怎么防御DDoS攻击?

在网络安全领域&#xff0c;DDoS攻击一直是热门话题&#xff0c;随着网络技术的不断发展和网络环境的复杂化演变&#xff0c;DDoS攻击变得愈加频繁、更具破坏性。根据2023年网络安全态势研判分析年度综合报告&#xff0c;全年全网网络层的DDoS攻击次数达2.51亿次&#xff01;本…

五一前的最后一个工作日

最近在学习 Elasticsearch 的使用&#xff0c;也更了几篇文章了&#xff0c;后续的话应该要等到节后再说了&#xff08;因为真的背不动电脑回家&#xff09; 再来看下这次五一假期的组成&#xff0c;1 号到 5 号&#xff0c;共五天&#xff0c;其中 2 号是 28 号周日调休来的&a…

【leetcode面试经典150题】74. 填充每个节点的下一个右侧节点指针 II(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

【人工智能】AI赋能城市交通 未来城市的驱动力

前言 随着城市化进程的不断加速&#xff0c;交通拥堵、环境污染等问题日益凸显&#xff0c;人们对交通系统的效率和可持续性提出了更高的要求。在这样的背景下&#xff0c;智能交通技术正成为改善城市交通的重要驱动力。本文将探讨智能交通技术在解决城市交通挑战方面的应用和未…

信息化工作人员必备常识12——远程桌面的使用与技巧

信息化工作人员必备常识12——远程桌面的使用与技巧 前言信息化人员必备常识回顾&#xff08;不想看回顾的直接往下滑哦~&#xff09;pingtelnetnslookup命令ipconfig命令域名DNS本机DNS缓存查看与清理DNS劫持DNS污染&#xff08;域名服务器缓存投毒&#xff09; 远程桌面开启远…

Python多线程并不是真的并行执行

Python多线程虽然能够利用多个CPU核执行计算&#xff0c;但并不能真正执行多线程并行计算。因为在Python中&#xff0c;有一个全局解释锁&#xff08;GlobalInterpreter Lock&#xff0c;GIL&#xff09;&#xff0c;该锁的存在使得在同一个时间只有一个线程执行任务&#xff0…

TiDB 利用binlog 恢复-反解析binlog

我们知道TiDB的binlog记录了所有已经执行成功的dml语句&#xff0c;类似mysql binlog row模式 &#xff0c;TiDB官方也提供了reparo可以进行解析binlog&#xff0c;如下所示: [2024/04/26 20:58:02.136 08:00] [INFO] [config.go:153] ["Parsed start TSO"] [ts449…

软考中级之数据库系统工程师笔记总结(五)网络基础

作者&#xff1a;Maynor 博客之星大数据领域Top1,GitHub项目awesome-chatgpt-project作者, 腾讯云TDSQL-C数据库开发者, 全网技术矩阵粉丝7w 公众号&#xff1a;Maynor996随着信息技术的飞速发展&#xff0c;数据库已成为现代企业和组织不可或缺的数据管理工具。对于许多专业人…

pycharm安装pandas包

import pandas时提示未安装pandas&#xff0c;点击下图红框选项&#xff0c;进行pandas安装 pycharm底部会有安装中的提示 pycharm底部提示红框的内容&#xff0c;说明安装成功 这个时候就可以看到import pandas不再报错了

Spring-Mybatis-Xml管理(动态sql语句,sql语句复用)

目录 前置条件 动态SQL语句 动态删除数据 1.集合类型:数组 2.集合类型: List 型 SQL语句重用 说明 &#x1f9e8;前置条件 已经创建了实体类(这边举个例子) 实体类User表 表中的字段名User实体类的属性值id (bigint auto increment) 长整型 自动增长private Long iduser…

消失的数字

一、题目 原题链接. - 力扣&#xff08;LeetCode&#xff09; 二、解题 int missingNumber(int* nums, int numsSize){ //a^0a; //a^a0; //先求出0^1^2......^n的数&#xff0c;再将其与数组每个元素异或即可得到要寻找的数字 int ret0; for(int i0;i<numsSize;i) {ret^i;…

transformer原理-Attention Is All You Need

文章目录 前言动机NLP任务特点循环神经网络循环神经网络流行原因循环神经网络缺点 transformer架构整体架构&#xff08;编码器-解码器&#xff09;自注意力&#xff08;self-attention&#xff09;传统NLP解决方案改进思路 多头注意力&#xff08;Multi-Head Attention&#x…

《Fundamentals of Power Electronics》——反激变换器

反激转换器基于升降压转换器&#xff0c;接下去介绍它的演变过程。下图中的a描述了基本升降压型转换器电路&#xff0c;用一个MOSFET和二极管实现开关。 在图b中&#xff0c;电感绕组由两根导线构成&#xff0c;匝数比为1:1。电感的基础作用未改变&#xff0c;并联绕组可以等效…

在 Windows 系统上安装 TeamViewer 13

在 Windows 系统上安装 TeamViewer 13 References 默认安装到所有用户 同意协议 安装目录 勾选内容 打开文件位置 打开 rClientID.exe Extras -> Options -> Advanced Show advanced options -> Display language 重新启动TeamViewer 语言可修改为中文简体 …

Web 渗透测试神器:HackBar 保姆级教程

一、介绍 HackBar 是一个用于浏览器的扩展插件&#xff0c;主要用于进行网络渗透测试和安全评估。它提供了一系列方便的工具和功能&#xff0c;可以帮助用户执行各种网络攻击和测试&#xff0c;包括 XSS、SQL 注入、CSRF、路径穿越等。以下是 HackBar 插件的一些主要特点和功能…

Transformer - Layer Normalization

Transformer - Layer Normalization flyfish y x − E [ x ] V a r [ x ] ϵ ∗ γ β y \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] \epsilon}} * \gamma \beta yVar[x]ϵ ​x−E[x]​∗γβ 论文 Layer Normalization import numpy as np import torch import…

【Jenkins】持续集成与交付 (一):深入理解什么是持续集成?

🟣【Jenkins】持续集成与交付 (一):深入理解什么是持续集成? 1、软件开发生命周期与持续集成2、 持续集成的流程3、持续集成的好处4、Jenkins的应用实践5、结语💖The Begin💖点点关注,收藏不迷路💖 1、软件开发生命周期与持续集成 软件开发生命周期(SDLC)是指软…

Redis缓存介绍以及常见缓存问题:穿透、雪崩和击穿

概念 缓存就是数据交换的缓冲区&#xff08;Cache&#xff09;&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 作用&#xff1a; 降低后端负载 提高读写效率&#xff0c;降低相应时间 成本&#xff1a; 数据一致性成本 代码维护成本 运维成本 缓存更…

使用pyqt编写的页面导航框架

使用pyqt编写的页面导航框架 效果 介绍代码 效果 介绍 使用pyqt多种控件编写的导航框架&#xff0c;左边是菜单栏&#xff0c;点击不同的菜单选项可以切换到不同的页面。 代码 import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QP…

微服务之分布式理论zookeeper概述

一、分布式技术相关的理论 CAP理论 CAP定理(CAP theorem)&#xff0c;⼜被称作布鲁尔定理(Eric Brewer)&#xff0c;1998年第⼀次提出. 最初提出是指分布式数据存储不可能同时提供以下三种保证中的两种以上: (1) ⼀致性(Consistency): 每次读取收到的信息都是最新的; (2) …