mysql索引结构

多种数据结构

在数据库索引领域,特别是MySQL的InnoDB存储引擎中,聚簇索引(Clustered Index)和非聚簇索引(也称为二级索引,Secondary Index)是两种主要的索引类型。这些索引类型在数据结构的选择上有所不同,而Hash结构、二叉搜索树(BST)、AVL树、B-Tree、B+Tree和R-Tree是常见的索引数据结构。下面我将对这些数据结构进行类比,并特别关注它们在InnoDB中的使用情况。

1. Hash结构

  • 特点:Hash索引基于哈希表实现,提供O(1)复杂度的查找性能,适用于等值查询。
  • 在InnoDB中的应用:InnoDB不直接支持传统的Hash索引,但提供了自适应哈希索引(Adaptive Hash Index, AHI),该索引是自动生成的,不能人为干预,且主要用于等值查询优化。

2. 二叉搜索树(BST)

  • 特点:每个节点最多有两个子节点(左子节点和右子节点),左子节点的值小于父节点,右子节点的值大于父节点。
  • 在InnoDB中的应用:由于BST在数据量大时高度可能很高,导致查询效率下降,因此InnoDB不直接使用BST作为索引数据结构。

3. AVL树

  • 特点:AVL树是一种自平衡的二叉搜索树,任何节点的两个子树的高度最大差别为1。它通过旋转操作来保持树的平衡。
  • 在InnoDB中的应用:InnoDB同样不直接使用AVL树作为索引数据结构,因为B+树在数据库索引中提供了更好的性能。

4. B-Tree

  • 特点:B-Tree是一种多路平衡搜索树,每个节点可以有多个子节点。所有叶子节点位于同一层,且所有叶子节点包含全部关键字信息,并指向记录数据的指针。
  • 在InnoDB中的应用:虽然InnoDB的索引实现基于B+Tree,但B-Tree作为其基本思想的一部分,也值得提及。然而,InnoDB最终选择了B+Tree作为索引的主要数据结构。

5. B+Tree

  • 特点:B+Tree是B-Tree的一种变体,所有值都出现在叶子节点,且叶子节点之间互相链接。非叶子节点仅存储关键字信息,用于索引,不存储实际数据。
  • 在InnoDB中的应用:InnoDB的聚簇索引和非聚簇索引都是基于B+Tree实现的。聚簇索引将表数据按照主键的顺序存储在磁盘上,非聚簇索引则存储索引列和对应数据的主键指针。

6. R-Tree

  • 特点:R-Tree是一种用于空间数据索引的数据结构,如地理信息系统(GIS)中的点、线和多边形等空间对象。
  • 在InnoDB中的应用:InnoDB存储引擎并不直接支持R-Tree作为索引数据结构,因为它主要用于处理非空间数据。对于空间数据索引,MySQL提供了其他存储引擎,如MyISAM(尽管MyISAM也不直接支持R-Tree,但MySQL有专门的空间扩展来支持空间数据)。

类比总结

数据结构特点在InnoDB中的应用
Hash结构O(1)复杂度查找,适用于等值查询自适应哈希索引,用于等值查询优化
二叉搜索树(BST)高度可能较高,导致查询效率下降不直接使用
AVL树自平衡二叉搜索树,保持树的高度较低不直接使用
B-Tree多路平衡搜索树,所有叶子节点位于同一层索引实现的基础思想之一,但InnoDB最终选择B+Tree
B+TreeB-Tree的变体,所有值在叶子节点,叶子节点间互相链接聚簇索引和非聚簇索引的主要数据结构
R-Tree用于空间数据索引的数据结构不直接在InnoDB中使用,适用于其他存储引擎或MySQL的空间扩展

综上所述,InnoDB存储引擎在索引的实现上主要选择了B+Tree作为其核心数据结构,因为它在数据库索引的多种需求下提供了良好的性能和灵活性。

MySQL的BTree索引结构

在这里插入图片描述
在这里插入图片描述
在InnoDB存储引擎中,表的数据以多种方式存储和组织,主要依赖于其行格式(Row Format)和表空间(Tablespace)的结构。下面详细解释这些组成部分和格式。

1. 行格式 (Row Formats)

InnoDB提供了多种行格式以优化存储和访问效率,主要包括:

  • COMPACT:是InnoDB的默认行格式(从MySQL 5.0.3开始),它紧凑地存储数据,减少了空间浪费。
  • REDUNDANT:是一种早期的行格式,为了向后兼容而保留。它存储了大量的冗余信息,使得每行数据都很大。
  • DYNAMICCOMPRESSED:这两种格式都是为了处理大字段(如BLOB、TEXT)而设计的。DYNAMIC允许将大字段的数据存储在数据页之外,仅保留一个指针在数据页中;COMPRESSED则进一步对这些数据进行压缩。
数据页组成部分
  • 文件头 (File Header):包含页的通用信息,如页号、页类型、校验和等。
  • 页头 (Page Header):包含页的状态信息,如页是否为空、已删除记录的数量、页中记录的数量等。
  • 最大最小记录 (Infimum + Supremum):页中的两条虚拟记录,分别作为记录的边界,保证页中的记录始终有序。
  • 用户记录 (User Records):实际存储的表记录。
  • 空闲空间 (Free Space):页中未使用的空间,可用于插入新记录或记录更新。
  • 页目录 (Page Directory):一个槽数组,用于快速定位页中的记录。
  • 文件尾 (File Tailer):页的末尾,包含页的校验和,用于页的完整性验证。

2. 表空间 (Tablespaces)

InnoDB的表数据存储在表空间中,表空间可以是系统表空间或独立表空间。

  • 系统表空间 (System Tablespace):包含系统数据字典、撤销日志、回滚段等,以及用户表的数据(如果配置为使用系统表空间)。
  • 独立表空间 (File-per-table Tablespace):每个表都有自己独立的表空间文件(.ibd),这样可以更方便地管理表和表空间。
  • 撤销表空间 (Undo Tablespace):专门用于存储撤销日志,这些日志用于事务的回滚操作。
  • 临时表空间 (Temporary Tablespace):存储临时表和查询的中间结果。

3. 区和段 (Extents and Segments)

  • 区 (Extent):InnoDB存储引擎分配空间的基本单位,默认大小为1MB(64个连续的页)。
  • 段 (Segment):区被进一步组织成段,段是表的一部分,可以包含多个区。段可以是索引段、数据段、撤销段等。

总结

InnoDB的存储结构通过行格式、页、区、段和表空间的多级组织,提供了高效的数据存储和访问能力。不同的行格式适用于不同的应用场景,而表空间则提供了灵活的数据管理方式。了解这些结构对于优化数据库性能至关重要。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Qzer_407

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

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

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

打赏作者

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

抵扣说明:

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

余额充值