InnoDB内部实现一点笔记

1.后台线程

InnoDB是多线程模型,后台有不同的线程负责处理不同的任务

1.1master thread

非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性

1.2IO thread

InnoDB大量使用了AIO来处理写IO请求,极大地提高了数据库的性能

1.3 purge thread

事务被提交后,其所使用的undolog可能不再需要了,所以使用purgethread来回收已经使用并分配的undo页

1.4 page cleaner thread

负责处理脏页的刷新

2.自适应哈希索引

InnoDB会监控表上各个索引页的查询,若发现某些页访问频率很高,则会自动建立自适应哈希索引(AHI),AHI通过缓冲池的B+树页构造而来,因此其建立的速度很快,而且不需要对整张表建立索引。这是个InnoDB自动建立过程,不需要人为干预

3.异步IO

异步IO除过能提高磁盘的操作性能,还有一个优势就是IO merge,也就是将多个IO合并成一个IO,提高IOPS性能。比如用户分多次访问连续页的数据,那么AIO判断这个页是连续后,会发送一个IO请求,取到多次请求的结果

4.刷新相邻页

当InnoDB刷新一个页时,会判断相邻的页是否是脏页,若是,会将其一起刷新。有一个问题是,我们刷新的页是不是又会马上被刷新,因为一般刷新是LRU算法,这里直接刷新,会不会有问题?

5.索引组织表

InnoDB中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表,如在创建表时没有指定主键,则自动创建一个6字节的主键

6.InnoDB存储结构

InnoDB中,所有的数据都被存放在一个空间中,称为表空间。表空间由段、区、页组成

6.1表空间

可以看做是InnoDB存储引擎的最高逻辑结构层,所有的数据都存放在表空间中。默认有一个共享表空间,但用户也可以设定每张表的数据单独放到一个表空间中。

6.2段

表空间由多个段组成,常见的段有数据段,索引段,回滚段。在B+树中,数据段即为叶子节点,索引段即为非叶子节点

6.3区

区由连续的页组成,任何情况下大小都为1mb。为了保证区中页的连续性,InnoDB一次会从磁盘申请多个区,默认情况下,一个页大小为16kb,所以一个区中一共有64个连续的页。现在也引入了压缩页

6.4页

页时InnoDB磁盘管理的最小单位,有多种类型的页。页中有一个属性叫做page directory记录了记录的相对位置。牢记的是,B+树索引并不能找到具体的记录,它只会找到记录所在页,数据库把页载入内存,然后通过page directory进行二分查找,内存中二分查找很快,所以这部分查找时间可以忽略不计

7.InnoDB分区

分区主要是为了数据库的高可用性

主要有range分区,如 2

分区不一定提高性能,但肯定会提高数据库的可用性


自己整理的笔记,不喜勿喷,欢迎指正

 

你可能感兴趣的:(数据库,mysql,InnoDB,数据库文件,数据库引擎)