MySQL 体系结构总结

发布于 2月21日  约 4 分钟

image.png

  1. 体系结构

     *  Connector:用来支持各种语言和 SQL 的交互,比如 PHP,Python,Java 的JDBC;
     *  Management Serveices & Utilities:系统管理和控制工具,包括备份恢复、MySQL 复制、集群等等;
     *  Connection Pool:连接池,管理需要缓冲的资源,包括用户密码权限线程等等;
     *  SQL Interface:用来接收用户的 SQL 命令,返回用户需要的查询结果
     *  Parser:用来解析 SQL 语句;
     *  Optimizer:查询优化器;
     *  Cache and Buffer:查询缓存,除了行记录的缓存之外,还有表缓存,Key 缓存,权限缓存等等;
     *  Pluggable Storage Engines:插件式存储引擎,它提供 API 给服务层使用,跟具体的文件打交道
    
  2. 结构进行分层

           连接层:和客户端的连接以及密码验证等
           服务层:此法分析,生成执行计划,返回结果
           存储引擎层:存储数据,提供数据的读写
  3. 一条更新的sql是怎样执行的?

    更新与查询的操作流程有什么不同呢,区别在于拿到符合条件的数据之后的操作记录;
    在我们更改数据的时候,会将数据从磁盘读到内存中,叫做也的概念,操作系统一般大小为4K,而在InnoDB中大小一般为16K大小;
    对于数据的修改在磁盘中的操作太慢,所以提供了缓冲池的技术,把数据读取到内存区域中,在下一次读取的时候,如何数据存在的话,直接进行使用,不在访问磁盘了;
    该内存区域叫做Buffer pool
    在修改数据的时候,内存和磁盘的数据不一致,我们叫做脏页;InnoDB专门有线程将内存区域中的数据每隔一段时间写到磁盘上,叫做刷脏;

    4 . InnoDB内存结构和磁盘结构
    image.png

  • Buffer pool

    缓存的是page页面的信息
  • redo log

    如果数据还没有刷入磁盘,数据库宕机,数据会丢失;
    该日志保存的是InnoDB把对页面的修改操做的一个日志文件,
    数据库在启动的时候从这文件恢复操作(实现crash-safe)
    redo log 叫做重做日志,日志和磁盘的配合过程叫做WAL技术,在SparkStream的kafka的整合中的receiver技术就用到了WAL技术,先写日志,在写磁盘

    我们为什么使用先写日志在写磁盘?

    写日志是顺序的I/O,在kafka中的就有体现,速度快,效率高

    特点:

    1.InnoDB实现的,支持崩溃恢复
    2.记录的是这个页做了什么改动,物理日志
    3.大小的固定的,一旦写满,触发机制将redo log日志同步磁盘;后续的日志进行覆盖
  • undo log

    undo log(撤销日志或回滚日志)记录了事务发生之前的数据状态(不包括 select)。如果修改数据时出现异常,可以用 undo log 来实现回滚操作(保持原子性)。

update user set name = 'ldp' where id=1;

流程:

1.事务开始,内存区域或者磁盘读取到数据,返回给服务器
2.执行器修改数据为ldp
3.记录name=lll到undo log中
4.记录name=ldp到redo log中
5.引擎接口,都内存中修改数据
6.事务提交

5.BInlog

服务层的日志文件,记录DDL与DML的日志,追加形式,来实现数据的恢复与主从复制
在修改数据的时候,有缓存用缓存-->写数据到redo log(prepare提交)-->记录到binlog中,(commit)状态-->更新完成

在redo log中有两阶段的提交,(prepare和commit)
阅读 144发布于 2月21日

推荐阅读
目录