MySQL--执行一条 select 语句,期间发生了什么?

执行一条 SQL 查询语句,期间发生了什么?

  • 连接器:建立连接,管理连接、校验用户身份;
  • 查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;
  • 解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;
  • 执行 SQL:执行 SQL 共有三个阶段:
    • 预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。
    • 优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;
    • 执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;


一、MySQL的架构(两层)

  • Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)都在 Server 层实现。
  • 存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。


二、Server层

1.连接器

  • 连接MySQL服务:与客户端进行TCP三次握手(因为 MySQL 是基于 TCP 协议进行传输的)
# -h 指定 MySQL 服务得 IP 地址,如果是连接本地的 MySQL服务,可以不用这个参数;
# -u 指定用户名,管理员角色名为 root;
# -p 指定密码,如果命令行中不填写密码(为了密码安全,建议不要在命令行写密码),就需要在交互对话里面输入密码
mysql -h$ip -u$user -p
  • 校验客户端的用户名和密码,如果用户名或密码不对,则会报错
  • 如果用户名和密码都对了,会读取该用户的权限(保存),然后后面的权限逻辑判断都基于此时读取到的权限
show processlist        //查看 MySQL 服务被多少个客户端连接
kill connection + id    //手动断开空闲的连接

(1)MySQL 定义了空闲连接的最大空闲时长,由 wait_timeout 参数控制的,默认值是 8 小时(28880秒),如果空闲连接超过了这个时间,连接器就会自动将它断开。

(2)MySQL 服务支持的最大连接数由 max_connections 参数控制,比如我的 MySQL 服务默认是 151 个,超过这个值,系统就会拒绝接下来的连接请求,并报错提示“Too many connections”。

(3)MySQL 的连接也跟 HTTP 一样,有短连接和长连接的概念。

// 短连接
连接 mysql 服务(TCP 三次握手)
执行sql
断开 mysql 服务(TCP 四次挥手)// 长连接
连接 mysql 服务(TCP 三次握手)
执行sql
执行sql
执行sql
....
断开 mysql 服务(TCP 四次挥手)

使用长连接的好处就是可以减少建立连接和断开连接的过程,所以一般是推荐使用长连接。

但是,使用长连接后可能会占用内存增多,因为 MySQL 在执行查询过程中临时使用内存管理连接对象,这些连接对象资源只有在连接断开时才会释放。如果长连接累计很多,将导致 MySQL 服务占用内存太大,有可能会被系统强制杀掉,这样会发生 MySQL 服务异常重启的现象。

解决长连接占用内存的问题?

有两种解决方式。

第一种,定期断开长连接。既然断开连接后就会释放连接占用的内存资源,那么我们可以定期断开长连接。

第二种,客户端主动重置连接。MySQL 5.7 版本实现了 mysql_reset_connection() 函数的接口,注意这是接口函数不是命令,那么当客户端执行了一个很大的操作后,在代码里调用 mysql_reset_connection 函数来重置连接,达到释放内存的效果。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。


2.查询缓存

  • MySQL 服务收到 SQL 语句后,就会解析出 SQL 语句的第一个字段,看看是什么类型的语句。
  • 如果 SQL 是查询语句(select 语句),MySQL 就会先去查询缓存( Query Cache )里查找缓存数据,看看之前有没有执行过这一条命令,这个查询缓存是以 key-value 形式保存在内存中的,key 为 SQL 查询语句,value 为 SQL 语句查询的结果。
  • 如果查询的语句命中查询缓存,那么就会直接返回 value 给客户端。如果查询的语句没有命中查询缓存中,那么就要往下继续执行,等执行完后,查询的结果就会被存入查询缓存中。

查询缓存挺鸡肋

对于更新比较频繁的表,查询缓存的命中率很低的,因为只要一个表有更新操作,那么这个表的查询缓存就会被清空。如果刚缓存了一个查询结果很大的数据,还没被使用的时候,刚好这个表有更新操作,查询缓冲就被清空了,相当于缓存了个寂寞。

所以,MySQL 8.0 版本直接将查询缓存删掉了,也就是说 MySQL 8.0 开始,执行一条 SQL 查询语句,不会再走到查询缓存这个阶段了。

对于 MySQL 8.0 之前的版本,如果想关闭查询缓存,我们可以通过将参数 query_cache_type 设置成 DEMAND。


3.解析器

  • 词法分析:识别关键字
  • 语法分析:检查语法是否正确,然后构建SQL语法树


4.执行SQL

4.1 预处理器

  • 检查 SQL 查询语句中的表或者字段是否存在
  • 将 select * 中的 * 符号,扩展为表上的所有列

4.2 优化器

  • 将 SQL 查询语句的执行方案确定下来,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引。

4.3 执行器

在执行的过程中,执行器就会和存储引擎交互了,交互是以记录为单位的。

有三种方式执行:

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


三、参考

小林 coding

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

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

相关文章

Vue.js+SpringBoot开发APK检测管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软件档案模块2.4 软件检测模块2.5 软件举报模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 开放平台表3.2.2 软件档案表3.2.3 软件检测表3.2.4 软件举报表 四、系统展示五、核心代…

Linux命令:dmesg命令

目录 1 dmesg命令1.1 简介1.2 说明1.3 案例1、显示所有内核消息2、实时监控新消息3、显示特定级别的消息4、将消息输出到文件5、搜索包含特定字符串的被检测到的硬件6、将开机信息发邮件7、打印并清除内核环形缓冲区 总结 1 dmesg命令 1.1 简介 dmesg 命令在 Linux 系统中用于…

Lord 3DMCV7-AHRS 时间同步硬件触发设置

目的:通过FPGA发送脉冲触发IMU采集数据。FPGA发送脉冲时,IMU才有数据产生。 FPGA与IMU的硬件接线就不讲了,这里主要说明的是IMU的设置以及ROS驱动的config文件更改。 1. WIN上位机设置 通过IMU在WINDOWS的上位机SensorConnect对IMU的GPIO、波特率等基本功能进行设值,具体…

通过spring boot/redis/aspect 防止表单重复提交【防抖】

一、啥是防抖 所谓防抖,一是防用户手抖,二是防网络抖动。在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容易因为用户的误操作或网络延迟导致同一请求被发送多次,进而生成重复的数据记录。要针…

用pyecharts的overlap绘制叠加图时,设置的颜色不起作用

问题 用pyecharts绘制叠加图时,如折线图上叠加散点图时,分别设置了自己的颜色(三角是绿色,圆形是蓝色),但是渲染颜色和图例颜色不一致,如下图所示,折线颜色和散点颜色相同。 解决…

Leet code 904 水果成篮

解题思路:滑动窗口 创建hash表记录水果的种类和数量 两个指针left 和 right 从数组起始位置开始滑动,right在循环内 hash[fruits[right]] 进窗口 然后判断 hash表中的种类是否大于2 一旦大于2就要想办法出窗口 出窗口需要将hash表中种类重回2种 …

python做筛子用

import randomdef roll_dice():roll random.randint(1,10)return roll def main():total_times 100#初始化列表result_list[0]*10for i in range(total_times):print(roll_dice())for j in range(1,11):if roll_dice() j:result_list[j-1] 1if __name__ __main__:main() 结…

基于Java (spring-boot)的个人博客系统

一、项目介绍 登录模块:用户登录、用户注册 普通用户:博客主页、博客随笔、博客留言、个人信息修改 管理员:系统管理、内容管理、文章管理、随笔管理、分类管理、标签管理、留言管理、评论管理、文件管理 博客编辑:支持富文本编辑…

Autosar教程-Mcal教程-Fls配置教程

3.11.1 FLS基础知识 flash操作中有两个术语:block和page。block是flash最小的擦除单位,page则是flash写入的最小单位。以我们使用的F1KM-S4(R7F7016533)来说,它的是64 bytes, page是4bytes。这也就意味着,如果要擦除的话,最小要擦除64 bytes,但是写入可以按4字节的大小写入…

程序员的知识宝库,100+开源书籍、文档

公众号:【可乐前端】,每天3分钟学习一个优秀的开源项目,分享web面试与实战知识,也有全栈交流学习摸鱼群,期待您的关注! 每天3分钟开源 hi,这里是每天3分钟开源,很高兴又跟大家见面了&#xff0…

每日五道java面试题之springMVC篇(四)

目录: 第一题. Spring MVC怎么样设定重定向和转发的?第二题.Spring MVC怎么和AJAX相互调用的?第三题. 如何解决POST请求中文乱码问题,GET的又如何处理呢?第四题. Spring MVC的异常处理?第五题. 如果在拦截请…

iOS面试题锦集

1. 问:一张图片所占内存大小跟什么有关? 图片所占内存大小,与图片的宽高有关 我们平时看到的png、jpg、webp这些图片格式,其实都是图片压缩格式。通过对应的算法来优化了大小以节省网络传输与本地保存所需的资源。 但是当我们加…

操作系统(一)

操作系统 一、操作系统的四个特性 并发性:并发性是指两个或多个时间在同一时间间隔发生,并发和并行是两个相似的概念,并行是指两个或多个事件在同一时刻发生。进程在宏观上并行,微观上串行 2.共享性:** 由于操作系统…

04-java基础--流程控制语句

一、switch语句 二、循环的三种结构 流程控制语句分为三种结构: 顺序结构(按代码的书写顺序执行,从上到下依次执行)分支结构(if语句、if–else语句、switch语句)循环结构(while、for循环、do–…

H5 响应式精品网站推荐导航源码

源码名称:响应式精品网站推荐导航源码 源码介绍:一款响应式精品网站推荐导航源码,可以自己修改代码替换图标图片和指向网址。背景图支持自动替换,背景图可以在img.php中修改 需求环境:H5 下载地址: http…

python_Anaconda虚拟环境导出以及重现

文章目录 1. 场景2. 解决方案2.1 方案一:直接将打包,然后将包传输到另外一台服务器2.2 方案二:导出环境所有的包名及版本,然后重新安装 1. 场景 我们有时候需要把一个虚拟环境迁移到别的服务器上面去,这时候&#xff…

JavaScript基础(超详细)

目录 1.JavaScript概述 2.JavaScript的组成及其基本结构 1.JavaScript的组成 1.ECMAScript ECMAScript是一种由Ecma国际[前向为欧洲计算机制造商协会(European Computer Manufacturers Associaiton)]通过ECMA-262标准化的脚本程序设计语言。其主要描述了JavaScript的语法…

使用阿里云服务器查看网站备案的方法和注意事项

随着互联网的发展,网站注册已成为在中国建设网站的必要步骤。 在使用阿里云服务器时,我们可以通过以下步骤查看网站注册状态。 备案概述: 在中国,互联网信息服务提供者必须进行登记,以监管互联网内容、规范市场运营和…

P1149 [NOIP2008 提高组] 火柴棒等式

题目描述 给你 �n 根火柴棍,你可以拼出多少个形如 ���ABC 的等式?等式中的 �A、�B、�C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 00&…

C语言:字符串逆序输出, test ok

【问题描述】字符串逆序:设计函数功能是将一个字符串逆序,函数声明:void stringNx(char a[ ]),使用这个函数完成将输入的字符串逆序输出。 【输入形式】要求输入一个字符串 【输出形式】逆序后输出 【样例输入】abcd 【样例输…