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交给优化器,由优化器选择最优的方案,最后的具体数据操作交给存储引擎处理,存储引擎处理完成后将结果返回。
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中移除相应的结点,则代表该页已被使用。
接下来是如何保证缓存中存的都是经常用的数据信息呢,这就需要使用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存储引擎。