MySQL存储引擎InnoDB1
来源:MySQL技术内幕:InnoDB存储引擎(第2版)
一:体系结构
-
Mysql体系结构
连接池组件,管理服务和工具组件,
SQL接口组件,查询分析器组件,优化器组件,缓冲组件,
插件式存储引擎组件,物理文件;
-
InnoDB体系结构
内存池:维护共享的数据结构,缓存磁盘数据,缓存修改,重做Redo日志缓冲;
后台线程:刷新内存池中的数据,保证缓存的是最新数据,将修改的数据刷新到磁盘文件;
二:表
-
索引组织表
InnoDB中,表都是根据主键顺序组织存放的,即索引组织表;
InnoDB主键创建方式:
1)首先判断表中是否有非空的唯一索引(unique not null),如果有该列为主键;
2)不符合1,自动创建一个6字节大小的指针; -
InnoDB的逻辑存储结构
默认共享表空间,即所有的数据都存放在表空间中。也可以每张表中的数据单独存放在一个表空间内。
页/块:InnoDB磁盘管理的最小单位,默认16kb。 数据页,undo页,实物数据页,大对象页。 -
Compact行记录格式
变长长度列表:有几个列的长度是可变的(Varchar),长度分别是多少,逆序;
NULL标志位,表示列数据是否有NULL值,1字节,二进制位中为1的index表示该列数据为NULL;
记录信息头:5字节,该行是否被删除,该记录拥有的记录数,下一条记录的相对位置 页内行记录链表结构;create table mytest( t1 varchar(10), t2 varchar(10), t3 char, t4 varchar(10) ) ROW_FORMAT =COMPACT; 数据 ('a','bb','bb','ccc') ('d','ee','ee','fff') ('d',NULL,NULL,'fff')
第1行数据:
变长字段列表,t1 t2 t4 逆序排列 t4 t2 t1,‘ccc’ 'bb' ‘a’,即03 02 01;
NULL标志位为空;
隐藏列:事务ID和行指针;
固定长度char,未能占用全部长度空间时,用0x20填充;
第2行数据:
NULL标志位为06, 00000110 列2列3为空;
不管是char还是varchar,null值不占用空间;
行溢出数据
大对象不会存放在数据页中;
innodb页中至少有两行记录,如果只能放一行,会自动将行数据存放到溢出页中; -
数据页结构
页是Innodb管理数据库的最小磁盘单位;
File header:记录了上一个页和下一个页,数据页双向链表组织; -
约束:保证存储数据的完整性
数据完整性有三种形式:- 实体完整性保证表中有一个主键
- 域完整性保证数据每列的值满足特定的条件;
- 参照完整性保证两张表之间的关系;
Innodb提供的约束,来保证上述的数据完整性要求:
- primary key,unique key - 唯一索引,
- foreign key
- default, not null
外键约束:对父表进行delete和update操作时子表的对应操作 示例
- cascade级联,
- set null,
- no action、restrict 抛出错误不允许操作发生(默认);
-
视图
视图View是一个命名的虚表,由一个SQL查询来定义,可以当做表来使用。
视图中没有实际的物理存储-> 操作映射到相应表上;
三:索引与算法
-
B+树索引
B+树索引并不能直接找到记录的具体行,只能找到页,然后数据库把页读入到内存,再在内存中查找数据。
联合索引
联合索引可以同时对(a,b)查询,也可以对a查询b已排好序,不能用来查询b,无序;
-
全文检索
全文检索
将数据库中的整本书或者文章中的内容查找出来。
select * from blog where content like 'xxx%'
B+树支持前缀查找
select * from blog where content like '%xxx%'
全文检索
全文检索通常使用倒排索引来实现,也是一种索引结构
倒排索引 -
哈希索引
Innodb会根据表的情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引。
场景:查找缓存池中的页
@梦工厂 2018.3.16