一、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、自增长与锁
五、事务