当前位置: 首页 > news >正文

MySQL架构和工作流程

引言:MySQL执行一条sql语句期间发生了什么?

想要搞清楚这个问题,我们必须了解MySQL的体系结构工作流程

一、MySQL体系结构

在这里插入图片描述

MySQL由以下几个部分组成

一、server层

1.MySQL Connnectors连接器,MySQL的连接池组件,网络连接使用io多路复用select处理

主线程:处理连接请求(select)

子线程:对应一条连接,处理该连接的sql请求

也就是说MySQL为每一条客户端连接创建一个线程来专门处理该连接的sql请求,因此,mysql的sql处理是多线程的,所以mysql默认最大连接数为151,过多的线程会占用大量内存

2.查询缓存

对于用户发送的sql查询请求(select)会先在缓存中查找,这个缓存是以key(sql命令)-value(结果)的方式存储的,如果找到则直接返回对应的结果value,没找到则进行下一步

在mysql8.0版本弃用了查询缓存,原因是在实际统计的使用数据中,查询缓存的命中率很低

命中率低的原因是:只要一个表有更新(修改)操作,这个表的查询缓存会被清空,所以每一次的查询缓存都是在该表的最新查询缓存中查找的,而不是所有缓存。因此,表更新则清空缓存的策略是安全且必要的,但是同时使得查询缓存的命中率很低

3.解析器

查询缓存未命中或mysql8.0后的版本,对于一个sql请求,mysql的server层要做的是进行词法语法分析,检查该sql语句是否符合协议,sql语句正确后生成语法树

4.预处理器

1.检查sql语句中指定的表和字段是否存在

2.将 * 替换为表中所有的列名

5.优化器

对于经过预处理的sql语句,优化器负责生成执行计划(执行sql的具体步骤),一般来说,优化器会生成多个执行计划,并选择出一个最优的计划,交由执行器执行

二、存储引擎(mysql使用innodb)

6.执行器

执行器和存储引擎进行交互

一条sql语句的执行流程

1.连接器:建立连接、管理连接、校验用户身份

2.查询缓存(mysql 8.0版本前):sql语句命中缓存则直接返回结果,未命中则继续执行

3.解析sql:进行词法(关键字)句法(语法)分析,生成语法树

4.执行sql:

  • 预处理:检查表和字段是否存在
  • 优化:生成执行计划并选择决定最优计划
  • 执行:执行器使用存储引擎提供的api与之交互

行sql:

  • 预处理:检查表和字段是否存在
  • 优化:生成执行计划并选择决定最优计划
  • 执行:执行器使用存储引擎提供的api与之交互

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • uniapp video视频铺满容器,不显示控件
  • DDR3(三)
  • EtherCAT主站IGH-- 9 -- IGH之eoe_request.h/c文件解析
  • SpringCloudGateway
  • go语言day10 接口interface 类型断言 type关键字
  • SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑
  • el-table实现固定列,及解决固定列导致部分滚动条无法拖动的问题
  • Buuctf之SimpleRev做法
  • 如何处理 PostgreSQL 中由于表连接顺序不当导致的性能问题?
  • 汽车电子工程师入门系列——AUTOSAR通信服务框架(下)
  • nginx(三)—从Nginx配置熟悉Nginx功能
  • react native优质开源项目
  • 【C++:默认成员函数初始化列表】
  • 论文回顾 | CVPR 2021 | How to Calibrate Your Event Camera | 基于图像重建的事件相机校准新方法
  • python转文本为语音并播放
  • 收藏网友的 源程序下载网
  • 345-反转字符串中的元音字母
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Angular 响应式表单之下拉框
  • angular组件开发
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • mongodb--安装和初步使用教程
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • SpringBoot 实战 (三) | 配置文件详解
  • swift基础之_对象 实例方法 对象方法。
  • 阿里云Kubernetes容器服务上体验Knative
  • 包装类对象
  • 力扣(LeetCode)56
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 算法-图和图算法
  • 想写好前端,先练好内功
  • 阿里云ACE认证之理解CDN技术
  • 如何正确理解,内页权重高于首页?
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​一些不规范的GTID使用场景
  • ###STL(标准模板库)
  • #大学#套接字
  • #数据结构 笔记三
  • #图像处理
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)appium-desktop定位元素原理
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (转)甲方乙方——赵民谈找工作
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .gitignore文件使用
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET和.COM和.CN域名区别