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

Mysql架构理论部分

Mysql架构是什么?实际可以理解为执行一条sql语句所要经历的阶段有哪些!

1.连接层

(1)客户端发起连接
   客户端通过TCP/IP、Unix Socket或命名管道等方式向Mysql服务器发起链接请求

 想要了解tcp与udp的区别,可以参考这篇文章
https://blog.csdn.net/ymb615ymb/article/details/123449588?ops_request_misc=%257B%2522request%255Fid%2522%253A%252293c621ab4e488bbc0967bd9f87bd4418%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=93c621ab4e488bbc0967bd9f87bd4418&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-123449588-null-null.142^v102^pc_search_result_base7&utm_term=tcp%E4%B8%8Eudp%E7%9A%84%E5%8C%BA%E5%88%AB&spm=1018.2226.3001.4187

(2)服务端接受链接

  当mysql服务器接收到客户端发来的请求后,服务器会建立一个线程或者连接句柄来处理客户端      的请求

  大致来讲,如果把mysql服务器当做一个进程的话,那么与每个客户端建立的链接则可以当做一个线程

(3)身份验证
  连接层会验证客户端提供的用户名和密码
  验证通过后,连接层会检查客户端是否有权限访问指定的数据库
  如果验证失败,连接层会拒绝链接并返回错误信息

(4)处理客户端请求
  客户端发送sql查询或者其他请求
  连接层将请求传递给查询解释器和优化器(解释器和优化器在后面会讲到)进行处理
  查询执行完成后,连接层将结果返回给客户端

 (5)关闭链接

2.缓存层

 缓存层是mysql中比较鸡肋的部分....


 与其他应用中的缓存器一样,mysql缓存层目的是为了减少数据库负载(即多次查询相同的数据库内容),提高反应速度


  但是mysql是通过sql语句来记录是否执行缓存层的,什么意思?


 如我想查询学生表中的所有信息,理论上   select * from students 与  select * from         students查询的结果是一样的,但是两个语句之间空格数量一样,缓存层就会认为这是不同的语句,无法发挥缓存的作用


  所以mysql5.6/5.7版本中存在缓存层,但是默认是关闭的,而mysql.8.0则是直接去掉了缓存部分,用相应的业务层来做缓存

3.解释层

(1)解析sql语句
        解析sql语句会用到解析器组件(如第三方解析器组件Druid)
        解析sql语句步骤:
        客户端将sql语句传到mysql服务器->解析该sql语句 词法和语法解析(关键字、条件、判断表和字段是否存在)->生成解析树

      

 (2)交给优化层


4.优化层


    要想从北京去往上海是有多条路径的但是哪个是最优路径呢,那就得交给优化层了

1)对于整个sql进行优化 优化器会对sql的条件进行调整 生成各种执行计划
 (2)对sql进行具体优化 去掉没必要的条件 EXPLAIN SELECT * FROM USER WHERE 1=1; SELECT*FROM USER;
   (3)优化器会选择合适的索引 但优化器不是万能的并不能全部优化成功 需要人工干预 慢查询就是例子

 


5.执行器与存储引擎

  存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取。MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的。每一种存储引擎都有它的优势和劣势。
可以使用 show engines; 命令来查看当前数据库所支持的所有的存储引擎。


 

举例:
有的时候可能需要查询速度快,不需要持久化,基于内存的操作,那么可以使用memory引擎。
有的数据是历史数据,基本上不会新增及其查询,提供压缩的功能就可以使用archive引擎。
有的时候需要非常多的 读写,并发,数据一致性的操作,可以使用innodb引擎


http://www.kler.cn/a/598648.html

相关文章:

  • QT二 QT使用generate form 生成常用UI,各种UI控件
  • 关于Docker是否被淘汰虚拟机实现连接虚拟专用网络Ubuntu 22.04 LTS部署Harbor仓库全流程
  • STM32滴答定时器(SysTick)原理及延时函数实现
  • redisson 使用与分析
  • 【微前端】使用微前端解决碎片化的用户界面问题实践
  • Android开发layer-list
  • Blender导出fbx到Unity找不到贴图的问题
  • Linux NFS、自动挂载与系统启动管理指南
  • 【深度学习】【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV3人脸检测
  • spring-security原理与应用系列:建造者
  • vue3之写一个aichat---实现聊天逻辑
  • OpenRAND可重复的随机数生成库
  • git 合并多次提交 commit
  • 【xiaozhi赎回之路-2:语音可以自己配置就是用GPT本地API】
  • display: contens的使用
  • python爬虫Redis数据库
  • 【MyDB】5-索引管理之4-单元测试
  • Jupyter Notebook 常用命令(自用)
  • AI安全学习(刚开始,未完版)
  • git 命令回退版本