MySQL存储引擎InnoDB1

来源:MySQL技术内幕:InnoDB存储引擎(第2版)

一:体系结构

  1. Mysql体系结构
    连接池组件,管理服务和工具组件,
    SQL接口组件,查询分析器组件,优化器组件,缓冲组件,
    插件式存储引擎组件,物理文件;


    MySQL存储引擎InnoDB1_第1张图片
  2. InnoDB体系结构
    内存池:维护共享的数据结构,缓存磁盘数据,缓存修改,重做Redo日志缓冲;
    后台线程:刷新内存池中的数据,保证缓存的是最新数据,将修改的数据刷新到磁盘文件;


    MySQL存储引擎InnoDB1_第2张图片

二:表

  1. 索引组织表
    InnoDB中,表都是根据主键顺序组织存放的,即索引组织表;
    InnoDB主键创建方式:
    1)首先判断表中是否有非空的唯一索引(unique not null),如果有该列为主键;
    2)不符合1,自动创建一个6字节大小的指针;

  2. InnoDB的逻辑存储结构


    MySQL存储引擎InnoDB1_第3张图片

    默认共享表空间,即所有的数据都存放在表空间中。也可以每张表中的数据单独存放在一个表空间内。
    页/块:InnoDB磁盘管理的最小单位,默认16kb。 数据页,undo页,实物数据页,大对象页。

  3. 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填充;


    MySQL存储引擎InnoDB1_第4张图片

    第2行数据:
    NULL标志位为06, 00000110 列2列3为空;
    不管是char还是varchar,null值不占用空间;


    MySQL存储引擎InnoDB1_第5张图片

    行溢出数据
    大对象不会存放在数据页中;
    innodb页中至少有两行记录,如果只能放一行,会自动将行数据存放到溢出页中;

  4. 数据页结构

    MySQL存储引擎InnoDB1_第6张图片

    页是Innodb管理数据库的最小磁盘单位;
    File header:记录了上一个页和下一个页,数据页双向链表组织;

  5. 约束:保证存储数据的完整性
    数据完整性有三种形式:

    • 实体完整性保证表中有一个主键
    • 域完整性保证数据每列的值满足特定的条件;
    • 参照完整性保证两张表之间的关系;

    Innodb提供的约束,来保证上述的数据完整性要求:

    • primary key,unique key - 唯一索引,
    • foreign key
    • default, not null

    外键约束:对父表进行delete和update操作时子表的对应操作 示例

    • cascade级联,
    • set null,
    • no action、restrict 抛出错误不允许操作发生(默认);
  6. 视图
    视图View是一个命名的虚表,由一个SQL查询来定义,可以当做表来使用。
    视图中没有实际的物理存储-> 操作映射到相应表上;

三:索引与算法

  1. B+树索引
    B+树索引并不能直接找到记录的具体行,只能找到页,然后数据库把页读入到内存,再在内存中查找数据。
    联合索引


    MySQL存储引擎InnoDB1_第7张图片

    联合索引可以同时对(a,b)查询,也可以对a查询b已排好序,不能用来查询b,无序;

  2. 全文检索
    将数据库中的整本书或者文章中的内容查找出来。
    select * from blog where content like 'xxx%' B+树支持前缀查找
    select * from blog where content like '%xxx%' 全文检索
    全文检索通常使用倒排索引来实现,也是一种索引结构

    MySQL存储引擎InnoDB1_第8张图片
    全文检索

    MySQL存储引擎InnoDB1_第9张图片
    倒排索引

  3. 哈希索引
    Innodb会根据表的情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引。
    场景:查找缓存池中的页


@梦工厂 2018.3.16

你可能感兴趣的:(MySQL存储引擎InnoDB1)