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

Mysql架构

思考:Mysql需要重点学习什么:

  1. 索引:索引存储结构、索引优化......
  2. 事务:锁机制与隔离级别、日志、
  3. 集群架构

本文是对Mysql架构进行初步学习

1、Mysql链接

Mysql监听器是长连接 BIO(阻塞同步IO调用), 不是NIO.

为什么这么设计, 因为mysql影响性能的关键是磁盘IO操作而非并发

2、一个mysql查询语句执行过程

Mysql服务器

  1. Server层:涵盖Mysql大多数核心业务,以及所有内置函数。
  2. 存储引擎层:负责数据的检索存储,其架构模式是插件式的,支持InnoDB、MyISAM等多种存储引擎。从Mysql5.5.5InnoDB成为默认存储引擎,也可以在创建表的时候制定存储引擎。

Server

  1. 客户端:执行sql语句请求,比如navicat工具
  2. 查询缓存:用处不大,Mysql8.0就去掉了。 变更操作会清空缓存,同时还需要保障缓存和DB的一致性,变更操作可能比较频繁,数据一致性保障对mysql服务性能也有影响,所以用处不大。
    1. 参数query_cache_type,设置使用缓存的场景
      1. 0 (OFF)全不使用
      2. 1(ON)除了显示要求不使用缓存的,其余都走缓存
      3. 2(DEMOND) 除了显示要求使用缓存的,都不走缓存
        1. select SQL_CACHE * from user where id=1
  3. 连接器:mysql服务部署在服务器上,并开放某个端口(127.0.0.1:3306), 客户端需要和这个端口建立连接,从而实现与mysql服务器的通信。这部分由连接器完成。
    1. 客户端建立连接后,如果长时间没有动静,连接器就会将它断开。由参数wait_timeout控制,默认8小时。
    2. 项目中连接数据库一般使用线程池,这样可以复用现有的连接,而不是频繁的创建和销毁他们。
  4. 分析器:词法分析+语法分析
    1. 将sql语句中的关键字识别出来,也会识别出表名、字段名。
    2. 语法分析就是校验这个sql是否能满足sql语法的规范以及是否能正常执行。
  5. 优化器:explain 、执行计划  、成本分析 、索引选择 都是在优化器中实现
    1. 是否使用索引,使用哪个索引
    2. join语句中, 先查询哪个表(一般先查小表)问题:A join B , A的量比B多, 但是A加了限定条件后比B加了限定条件后数据量少, 这时先查哪个表?
  6. 执行器:操作引擎,返回结果
    1. 判断用户有没有表的操作权限。分析器可以做一些初步的校验,但是SQL执行过程中涉及的表可能不止字面上的表,有可能会有触发器这种在运行时才确定的过程, 分析器是不能对这种运行时才确定的表做校验

    InnoDB

    1.   Mysql默认的存储引擎,支持事务、行级锁和外键约束。
    2.   InnoDB有自己的日志系统,称作redo log(重做日志)和undo log(撤销日志)。正是因为有日志,所以才支持事务。
    3.   redo log用于保障数据库的持久性,在数据库宕机的时候可以用来恢复日志。
    4.   undo log用来支持事务的原子性和多版本并发控制(MVCC), 可用于在事务需要回滚的时候撤销sql的执行。

    2、一个mysql更新语句执行过程

            sql执行时如果每次更新都写磁盘, IO成本很高。先写内存日志再写磁盘(预写式日志) 称作WAL技术(Write-Ahead-Logging)

            更新与查询流程不一样,更新语句涉及到两个重要日志, redo log(重做日志) binlog(归档日志)

    1. redo log是InnoDb引擎带来的。是物理日志,记录的是“在某个数据页修改了什么”。 内存空间有限,循环写, 写满时就写回磁盘。
    2. binlog是mysql Server自带的。是逻辑日志,记录的这个语句的原始逻辑。追加写,不会覆盖之前的内容。

    根据这两个日志,再分析update的执行过程:

    (update T set c = c+1 where id = 2;)

    1. 写redolog和binlog是两个独立的过程, 应该要保障其事务性。Mysql内部使用两阶段提交,保障两份日志的一致性。
    2. redo log buffer : 是一块内存,commit之前的多条sql语句对应的日志,先写入rodo log buffer,  在commit的时候才把日志真正写入redo log 文件(文件名是ib_logfile+数字)

    场景分析1: binlog写完, redolog还没commit时crash, 崩溃恢复的时候Mysql怎么处理?

    答:事务可以被提交

    http://www.lqws.cn/news/563113.html

    相关文章:

  1. c++学习(五、函数高级)
  2. 大事件项目记录11-文章分类接口开发-删除文章分类
  3. Qt:QCustomPlot库简介
  4. Vue基础(18)_收集表单数据
  5. debian国内安装docker
  6. 【经验】bitsandbytes安装-LLAVA-1.5库调试
  7. 【数据标注师】分类标注
  8. AD 学习笔记——第一章 系统的安装及参数设置
  9. 一个简单测试Deepseek吞吐量的脚本,国内环境可跑
  10. 印度和澳洲的地理因素
  11. 西门子S7-200 SMART PLC:小型自动化领域的高效之选
  12. 数据库(MYsql)
  13. Qt-Advanced-Docking-System 关闭、禁止拖动、最大化按钮等设置
  14. 从静态到动态:Web渲染模式的演进和突破
  15. Spring Cloud:高级特性与最佳实践
  16. 布林带的使用
  17. 华为云Flexus+DeepSeek征文 |华为云ModelArts Studio集成OpenAI Translator:开启桌面级AI翻译新时代
  18. Pytest自动化测试执行环境切换的2种解决方案
  19. Linux基本命令篇 —— less命令
  20. c++学习(四、引用)
  21. ClickHouse基础知识
  22. 【编译原理】期末
  23. 14-C#的弹出的窗口输入与输出
  24. 在C++中#pragma“可选预处理指令的作用“。
  25. C++泛型编程1 - 函数模板
  26. PyQtNode Editor 第三篇创建节点(节点的定义)
  27. 电子电气架构 --- 车辆产品的生产周期和研发周
  28. 路由器对不同数据帧的处理
  29. WebRTC(十一):RTCP和SRTCP
  30. 黑客入门 | 用ROP和shellcode攻击SolarWinds Serv-U SSH漏洞