美文网首页
MySQL存储引擎InnoDB1

MySQL存储引擎InnoDB1

作者: 梦工厂 | 来源:发表于2018-03-16 12:06 被阅读43次

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

    一:体系结构

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


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


    二:表

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

    2. InnoDB的逻辑存储结构



      默认共享表空间,即所有的数据都存放在表空间中。也可以每张表中的数据单独存放在一个表空间内。
      页/块: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填充;


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


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

    4. 数据页结构


      页是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+树索引并不能直接找到记录的具体行,只能找到页,然后数据库把页读入到内存,再在内存中查找数据。
      联合索引



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

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

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


    @梦工厂 2018.3.16

    相关文章

      网友评论

          本文标题:MySQL存储引擎InnoDB1

          本文链接:https://www.haomeiwen.com/subject/gqylqftx.html