InnoDB原理

一、InnoDB体系架构

1、后台线程

1.1 Master Thread

负责将缓冲池的数据异步刷新到磁盘

1.2 IO Thread

1.3 Purge Thread

负责回收已经使用并分配的undo log页

1.4 Page Cleaner Thread

负责刷新脏页

2、内存

2.1 缓冲池

在数据库中进行读取页的操作时,首先将磁盘中的页存在缓冲池,下次再读相同的页时,可以从缓冲区读取

在进行修改操作时,会先修改缓冲池中的页,再以一定的策略刷新到磁盘上。

缓冲区中的数据页类型有:索引页、数据页、undo页、插入缓冲、自适应hash索引、InnoDB存储的锁信息等

缓冲区的大小可以通过innodb_buffer_pool_size来设置、通过innodb_buffer_pool_instances来设置缓冲区的实例个数

2.2 LRU List、Free LIst和Flush List

缓冲区的数据页都放在LRU(最近最少使用)列表中。

数据库刚启动时LRU列表是空的,这时数据页放在Free列表中,命中了便移到LRU列表中。

Flush列表存放脏页,并被刷新到磁盘

2.3 重做日志缓冲

InnoDB存储引擎首先将重做日志信息放入这个缓冲区redo log buffer,然后按一定频率刷新到redo log file

2.4 额外的内存池

二、表

1、索引组织表

在InnoDB引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表

2、InnoDB逻辑存储结构

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

2.1、表空间

表空间可以看作是InnoDB存储引擎的最高层,所有数据都存放在表空间中。默认情况下有一个共享表空间ibdada1。可以通过启用参数innodb_file_per_table来让每张表单独使用一个表空间,但每张表的表空间内存放的是数据、索引和插入缓冲bitmap页,其他诸如回滚信息、插入缓冲索引页、系统事务信息、二次写缓冲等还是存放在共享表空间中。所有共享表空间怎样都会不断增大。

2.2、段

表空间由各个段组成,如数据段、索引段、回滚段等。因为InnoDB引擎的表结构是索引组织表,所以索引即数据,数据即索引。数据段即为b+树的叶子节点,索引段即为b+树的非叶子节点。

2.3、区

区是由连续页组成的空间

2.4、页

页是InnoDB磁盘管理的最小单位,默认大小为16k,可以通过innodb_page_size将页的大小设置为4k、8k、16k。常见的页类型有:

数据页(B-tree node)、undo页、系统页、事务数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页、压缩的二进制大对象页等等。

2.5、行

InnoDB存储引擎是面向行的,也就是数据是按行存放的。

3、行记录格式

3.1、compat行记录格式

 变长字段的最大长度不超过2个字节。因为varchar最大长度限制为65535(实际是65532)

null标志位指示了该行数据中是否有null值,有则用1 表示,该部分占1字节

记录头信息

next_record记录了下一条记录的偏移量,所以InnoDB引擎在页内部时通过一种链表的结构来串联各个行记录的。

最后就是实际存储每个列的数据,null除了占有null标志位,不占用任何空间 

除此之外,每行数据还有两个隐藏列,事务id列和回滚指针列,分别为6字节和7字节大小。若该表没有定义主键,还会增加一个6字节的rowid列。

对于固定长度的char字段在未能完全占用其长度时会用0x20填充。

3.2、Redundant

3.3、行溢出数据

 InnoDb存储引擎可以将一条记录中的某些数据存储在真正的数据页面之外,例如blob类型。

事实上varchar也可以,varchar最大长度为65532字节(注意不是字符)

三、索引

1、B+树索引分为聚集索引和辅助索引,叶子节点存放着所有数据。不同的是,聚集索引的叶子节点存放的是一整行的数信息。

查询单条数据或少量数据使用B+树索引才有意义,否则优化器也可能不使用索引。

查询大量数据时,如果是多表联查,可以对连接字段使用索引

2、聚集索引

聚集索引能够在B+树的叶子节点上直接找到数据。

对主键的排序查找和范围查找速度非常快

2、辅助索引

对于辅助索引,叶子节点并不包含行记录的全部数据,而是包含了聚集索引键,用来告诉引擎哪里可以找到与索引相对应的行数据

3、联合索引

4、覆盖索引

5、优化器不使用索引的情况

6、哈希索引

哈希算法是为了解决直接寻址法的空间问题而诞生的。但是会有哈希碰撞的问题,用链接法解决哈希碰撞的问题。InnoDB中的页也是通过哈希表来进行查找的。

很熟悉索引适用于查找单条记录,速度非常快

7、全文检索

四、锁

1、锁的类型

1.1、共享锁(读锁)S Lock:允许事务读一行数据

1.2、排他锁(写锁)X Lock:允许事务删除或更新一行数据

 1.3、意向共享锁 IS Lock:事务想要获得一张表中某几行的共享锁

1.4、意向排他锁 IX Lock:事务想要获得一张表中某几行的排他锁

2、一致性非锁定读

即使用多版本并发控制MVCC技术。在读已提交和可重复读的隔离级别下,InnoDB会使用非锁定的一致性读。

如果读取的行正在执行DELETE或UPDATE操作,这时读取操作不会因此去等待行上锁的释放,而是去读取一个快照数据。该数据来自于undo页

3、一致性锁定读

使用SELECT……FOR UPDATE来对查询语句加写锁直到事务提交

或者SELECT……LOCK IN SHARE MODE 来对查询语句加读锁,并且不能再被加写锁知道事务提交

4、自增长与锁

五、事务

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值