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

相关推荐
安迁岚4 分钟前
【SQL Server】华中农业大学空间数据库实验报告 实验八 存储过程
数据库·sql·mysql·oracle
Achou.Wang10 分钟前
Redis过期时间和SORT命令的高级用法
数据库·redis·bootstrap
.ccc.。19 分钟前
mysql索引失效的五种情况
数据库
jnrjian1 小时前
OEM sql monitoring 类似SQL
数据库·sql
zxrhhm1 小时前
PostgreSQL 中约束Constraints
数据库·postgresql
惜.己2 小时前
Jmeter中的配置原件
java·前端·数据库
zwm_yy2 小时前
docker-mysql
mysql·docker·容器
不烦下雨c2 小时前
[Qt从入门到精通] 信号和槽
开发语言·数据库·qt
好玩的Matlab(NCEPU)3 小时前
C#+数据库 实现动态权限设置
开发语言·数据库·c#
zybsjn3 小时前
MongoDB 和 Redis 是两种不同类型的数据库比较
数据库·redis·mongodb