mysql的架构与存储引擎总结

MySQL的架构与存储引擎总结

mysql架构图

八大组成部分

1.Connectors

​ 与其他编程语言中的sql语句进行交互, 如php、python

2.Managerment Services & Utilities

​ 系统管理和控制工具

3.Connection Pool

​ 管理缓冲用户连接,线程处理等需要缓存的需求

4.SQL Interface(SQL接口)

​ 接收用户的SQL命令,并且返回用户需要的查询结果。

5.Parser (解析器)

​ 负责解析和验证SQL命令

6.Optimizer(查询优化器)

​ SQL语句在查询之前会使用查询优化器对查询进行优化(产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果) 使用的是“选取-投影-联接”策略进行查询。

7.Cache和Buffer(查询缓存)

​ 如果查询缓存中有命中的查询结果,查询语句就可以直接取查询缓存中的数据

8.Engine(存储引擎)

​ 存储引擎是Mysql中具体与文件打交道的子系统,Mysql的存储引擎是插件式的

SQL语句执行过程

​ 首先查询请求通过MySQL的connectors进行交互,请求会暂时存放在连接池并由Managed Serverces & Utilities管理,当该请求从等待队列进入到处理队列时,将请求交给SQL接口,SQL接口将请求交给Parser解析器检验语法,成功后将解析后的sql交给优化器,由优化器选择最优的方案,最后的具体数据操作交给存储引擎处理,存储引擎处理完成后将结果返回。

sql执行过程

InnoDB存储引擎

存储引擎架构图

InnoDB相当于一大块内存空间的管理子系统,通过对内存池空间的管理(空页管理,回写数据,替换页LRU),实现加速写与加速读。

加速写:不直接将数据写入物理磁盘,而是将数据缓存在内存中,当写入磁盘的事物被触发时一次性写入多个数据。

加速读:将常用数据写入缓存,当查询的数据存在缓存中时,则可立刻放回查询数据,提高缓存命中率即可提高加速读效率。

InnoDB中主要后台进程:

​ Master Thread:核心进程,主要负责将缓存池中的数据异步刷新到磁盘,保证数据的一致性。

​ IO Thread:负责IO请求的回调处理

​ Purge Thread:用来回收已经使用并分配的undo页

​ Page Cleaner Thread:刷新脏页

对于数据库中页的修改操作,首先修改在缓冲池中页,然后再以一定的频率刷新到磁盘,并不是每次页发生改变就刷新回磁盘。

Buffer Pool(一段连续的内存空间)如何管理

​ 在InnoDB中,缓冲池中的页大小默认为16KB。

缓存池管理图

​ 如何管理Buffer Pool中的页,通过控制页管理,控制页中包含管理页的锁信息、空间编号、页号等,空闲的空间,通过一个free list链表,该链表的结点就是所有空闲的页的控制页地址(16k),需要分配新的页只需到free list中移除相应的结点,则代表该页已被使用。

free 链表

​ 接下来是如何保证缓存中存的都是经常用的数据信息呢,这就需要使用LRU算法来淘汰不常用的数据页,保留常用的数据信息,则可提高缓存中数据的命中率。需要再新增一个链表方便淘汰缓存页,这个链被称为LRU链表。当访问某个页时,如果该页不在Buffer Pool中,则把该页从磁盘中加载到Buffer Pool的缓存页中,并将该缓存页包装成结点塞到LRU链表的头部;如果该页存在Buffer Pool中,则直接把该页对应的LRU链表结点移动到链表的头部。优化后将新读到的页插入到LRU列表的midpoint位置,默认配置插入到列表的5/8处。midpoint由参数innodb_old_blocks_pct控制。midpoint之前的为常用数据,后面的数据为不常用数据,innodb_old_blocks_time定时间对不常用数据刷出。

其次,讲到快写入是在缓存池中先进行数据更新的,则缓存中的数据与磁盘中的数据就不一致了,这样的缓存页也叫做脏页,考虑到如何判断哪些页是脏页,以及脏页写入磁盘的时间如何控制(一次性多个数据页的落盘),需要再次添加一个flush链表方便管理,将所有在LRU中被修改(第一次修改)的页添加到此列表中,脏页数据还存在于LRU链表中,只是在flush链表中的脏页记录只是通过指针指向LRU链表的脏页。并且脏页的刷新顺序通过oldest_lsn值控制,该值越小刷新优先级越高。

上诉三个链表的关系图可表示为:

三个链表关系图

Free链表与LRU链表是互相流通关系,页结点在两个链表中来回置换,而FLUSH链表记录了脏页数据,也是通过指针指向了LRU链表,所以图中FLUSH链表被LRU链表包裹。

InnoDB与MyISAM的相关特性比较:

  • InnoDB支持ACID的事务4个特性,而MyISAM不支持;
  • InnoDB支持4种事务隔离级别,默认是可重复读repeatable read,MyISAM不支持;
  • InnoDB支持crash安全恢复,MyISAM不支持;InnoDB支持外键,MyISAM不支持;
  • InnoDB支持行级别的锁粒度,MyISAM不支持,只支持表级别的锁粒度;
  • InnoDB支持MVCC,MyISAM不支持。
  • InnoDB特性上,InnoDB表最大可以64TB,支持聚簇索引、支持压缩数据存储,支持数据加密,支持查询/索引/数据高速缓存,支持自适应hash索引、空间索引,支持热备份和恢复等。

InnoDB存储引擎的核心特性包括这些:MVCC、锁、锁算法和分类、事务、表空间和数据页、内存线程以及状态查询。

mysql中常见存储引擎

MySQL中常用的四种存储引擎分别是: MyISAM存储引擎、innoDB存储引擎、MEMORY存储引擎、ARCHIVE存储引擎,CSV存储引擎、BlackHole存储引擎。

参考链接1

参考链接2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值