MySQL之InnoDB引擎(六)

1     InnoDB介绍

2     InnoDB架构

2.1   内存存储架构

2.1.1 缓冲池(Buffer Pool)

2.1.1.1 缓冲池LRU算法

2.1.1.2 缓冲池配置

2.1.1.3 监控缓冲池

2.1.2 缓冲变化(Change Buffer)

2.1.2.1 索引类型介绍

2.1.2.2 缓冲变化定义

2.1.2.3 缓冲变化配置

2.1.2.4 最大空间配置

2.1.2.5 缓冲变化监控

2.1.3  适应性哈希索引(Adaptive Hash Index)

2.1.4 缓冲日志(Log Buffer)

2.2   磁盘存储架构

2.2.1 数据表(Tables)

2.2.1.1 数据表的创建

2.2.1.2 外部表的创建

2.2.1.3 导入表数据文件

2.2.1.4 移动或者复制数据表

2.2.2 数据行的物理结构

2.2.2.1 字段起始偏移量

2.2.2.2 扩展字节

2.2.2.3 字段内容

2.2.3 数据页的物理结构

2.2.3.1 Fil Header

2.2.3.2   Page Header

2.2.3.3  Limits of Records

2.2.3.4  User Records

2.2.3.5  Free Space

2.2.3.6  Page Directory

2.2.3.7  Fil Trailer

2.2.3.8 数据页示例

2.2.4 索引(Indexes)

本章节主要描述InnoDB存储引擎的索引体系以及索引优化。

2.2.4.1 索引体系

InnoDB存储引擎的索引体系包括主级索引(主键索引)、次级索引(非主键索引)、索引的物理结构、排序索引的构建、全文检索。

2.2.4.1.1     主级索引

InnoDB存储引擎是关系型数据库的存储引擎,其存储的数据类型包括结构化的数据类型、半结构化的数据类型。为了提升检索数据的查询性能,InnoDB中的每个数据表都提供一个被称之为主级索引(clustered index)用于存储数据表中的每一行数据记录,主级索引也被称之为主键索引,每个数据表有且只有一个主级索引。

以下几点分别描述InnoDB如何运行主级索引提升数据检索以及数据操纵的性能:

  • 如果数据表已定义主键,则使用主键作为该数据表的主级索引,如果没有符合唯一性以及非空的列或者列组合作为主键,则需要在数据表中定义自增列作为主键,该自增列使用InnoDB提供的自增型字段类型、用户自定义的具有全局唯一性以及非空的特性的ID。

  • 如果用户没有在数据表中定义主键,则InnoDB使用第一个具有唯一性以及非空的字段或者字段组合作为主键索引。

  • 如果一张数据表没有具备以上两点的建立主级索引的条件,则InnoDB内部使用记录行的行ID自建立一个隐藏的被称之为GEN_CLUST_INDEX的主级索引,该主级索引按照记录的行ID排序,该行ID长度等于6个字节、单调递增。

InnoDB存储引擎的一个数据表的行记录数据与行记录索引数据是存储在同一个数据文件中,因此,当数据表的存储容量非常大的时候,使用索引检索数据的好处是能节省大量的由磁盘随机读带来的IO损耗。

2.2.4.1.2     次级索引

InnoDB存储引擎的索引机制包括一个主级索引与0个或者1个或者多个次级索引,次级索引也被称之为非主键索引,次级索引的结构中包括组成该次级索引的列或列组合、该行记录对应的主级索引,当用户使用次级索引检索数据的时候,InnoDB使用次级索引结构中的主级索引值在主级索引系统中检索对应的行记录数据,因此,主级索引的长度大小越小越好,有利于节省存储空间,因为当数据表的存储容量非常大的时候,索引也占用很大的存储空间。

2.2.4.1.3     索引的物理结构

由前面章节的描述可知,InnoDB存储引擎中存储数据的存储单元是页,也就是读写数据时是以页为单位,每页的默认大小是16kb,页包括多种类型,其中包括内节点页类型、索引页类型,索引页类型是用于存储索引系统的节点,由索引页类型组成的数据结构是B-tree。

一般情况下,每个索引页保留约1/16的空闲空间作为将来数据增长相关的数据插入与数据更新。

2.2.4.1.4     排序索引的构建

InnoDB索引系统的构建或者重新构建是使用一种称之为桶加载的技术,该技术本质上是一种高效的批量处理技术,其目的是替代低效的一次插入一个索引的单次处理技术。该技术包括三个执行阶段:

  • 第一个阶段,扫描主级索引树确定位置,从而生成数据的索引实体,保存索引实体在排序的缓冲中,当排序的缓冲空间被填满,对缓冲中的索引实体执行排序,排序完成写入到一个临时的索引文件中。

  • 第二阶段,当多批次的已排序的索引实体已被写入到临时的索引文件中,对临时的索引文件的多批次的索引实体执行合并排序。

  • 第三阶段,将已合并排序的索引实体写入到主级索引系统的B-tree的适合位置中。

批量处理技术与单次处理技术的区别如下所示:

  • 单次处理技术是,一次处理一个索引实体的插入,首先,遍历索引树(B-tree)查找到适合插入的节点位置,假如索引页的空间足够插入索引实体,则直接插入索引实体到对应的索引页中,假如索引页的空间不足够插入索引实体,则对B-tree结构实行节点的分割与合并的调整,该调整需要保持B-tree的平衡性,最终调整出足够的页空间插入索引实体。该技术是自顶向下处理索引实体的插入,其花费的系统开销包括在B-tree中找到合适的插入位置、树节点的分割与合并。

  • 批处理技术是,采用自底向上的策略,在B-tree结构的每个层次上都保持一个最右的叶子节点的指针引用,因为InnoDB是使用一种优化的B-tree结构,索引数据是存储在叶子节点中,而每个节点都具有上下左右方向的节点指针,通过最右的叶子节点的指针可以迅速找到适合更新或者插入的位置,然后在合适的位置上按照批次的排序顺序插入所有的索引实体,假如叶子节点的页空间不够,则使用叶子节点的向上指针创建下一个相邻的叶子节点继续插入所有索引实体。

综上所述,使用桶加载的批量处理技术构建主级索引体系是一种高效的索引处理技术。如下列举与排序索引的构建相关联的功能:

在索引页中预留一定比例的空间应对将来的索引空间的增长

用户可以使用innodb_fill_factor设置每个索引页预留的空间比例,例如设置该值等于80,则每个索引页空间都预留20%的剩余空闲空间应对未来索引空间的增长,该设置适用于叶子节点以及非叶子节点

排序索引的构建同样适用于全文检索

排序索引的构建与数据表的压缩

索引实体只插入到非压缩的索引页,当索引页被填满则对该索引页实行压缩存储

排序索引的构建与重做日志

重做日志是记录对数据操作的日志记录,在构建排序索引期间InnoDB暂停重做日志功能,使用检查点的方式异步记录所有的数据操作到磁盘中

排序索引的构建与优化器的信息统计

2.2.4.1.5     全文检索

InnoDB存储引擎支持全文检索的功能,支持全文检索的字段类型包括字符(char)、变长字符串(varchar)以及文本(text)三种字段类型。

2.2.4.1.6     全文检索的设计

InnoDB的全文检索功能使用倒排索引的设计。其中,倒排索引存储的是文本或者文档中出现的单词列表、以及出现该单词的文本或者文档列表、以及该单词出现在文本或者文档中的位置信息(以字节作为偏移量计算)。

2.2.4.1.7     全文检索的数据表

以下展示创建一个全文检索的数据表以及数据表生成的倒排索引的信息:

如上图所示,创建一个数据表opening_lines,其中文本类型字段opening_line声明为支持全文检索的索引。使用MySQL的系统表INNODB_TABLES查询数据表opening_line对应的倒排索引的相关表,其中opening_lines的数据表ID等于327,对应的16进制数值是0x147,opening_lines数据表中的索引字段idx对应的索引ID等于457,对应的16进制数值是0x1c9,由此可知,倒排索引的6个数据表的名称中包括数据表ID与索引ID的16进制数值。用户可以使用如下的SQL查询系统表中的索引信息:

当opening_lines数据表新增记录的时候,全文检索系统对新增的文本实行分词,将单词、文档ID、单词在文档中的位置插入到倒排索引表中,其中单词按照单词的首字符排序。用户可以使用innodb_ft_sort_pll_degree配置项设置分词的并行处理线程数,默认值等于2。

(未完待续)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangys2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值