数据库索引

目录

一、索引分类

1、聚簇索引

2、二级索引(辅助索引、非聚簇索引)

3、联合索引

二、迭代过程

1、二叉树

2、平衡二叉树

3、Btree(B树)

4、B+tree(B+树)


一、索引分类

1、聚簇索引

聚簇索引(Clustered Index)是一种特殊的索引类型,它定义了表中数据的物理排序顺序,并将表数据按照索引的顺序存储在磁盘上。

聚簇索引只能在一个表上建立一个,它通常是主键或唯一键索引。当聚簇索引存在时,表数据存储在聚簇索引的叶子节点中,因此聚簇索引也被称为主键索引或聚集索引。

聚簇索引的优点如下:

  1. 提高查询效率:由于聚簇索引定义了表中数据的物理排序顺序,因此在查询时可以直接使用索引定位到数据所在的磁盘块,并访问连续的数据块,减少了磁盘I/O操作,提高了查询效率。

  2. 提高范围查询效率:由于聚簇索引将表数据按照索引的顺序存储在磁盘上,因此在进行范围查询时,可以更快地定位到数据所在的磁盘块,并访问连续的数据块,减少了磁盘I/O操作,提高了查询效率。

  3. 减少磁盘空间使用:由于聚簇索引将表数据按照索引的顺序存储在磁盘上,因此可以减少数据存储空间的使用,提高存储效率。

聚簇索引的缺点如下:

  1. 插入操作性能较低:由于聚簇索引会改变表数据的物理排序顺序,因此在插入新数据时,需要重新排序表数据,并将数据插入到正确的位置上,因此插入操作的性能较低。

  2. 更新操作性能较低:由于聚簇索引会改变表数据的物理排序顺序,因此在更新数据时,需要重新排序表数据,并将数据更新到正确的位置上,因此更新操作的性能较低。

2、二级索引(辅助索引、非聚簇索引)

二级索引(Secondary Index),也称为辅助索引(Non-Clustered Index)或非聚簇索引,是一种用于加速数据库查询操作的索引类型。

与聚簇索引不同,二级索引并不直接存储表中数据的物理排序顺序,而是存储索引值和指向表中数据的指针。在查询时,MySQL先使用二级索引定位到表中符合条件的记录,然后再使用指针访问表中的实际数据。

二级索引的优点如下:

  1. 提高查询效率:由于二级索引存储了索引值和指向表中数据的指针,因此在查询时可以先使用二级索引定位到符合条件的记录,然后再使用指针访问表中的实际数据,减少了磁盘I/O操作,提高了查询效率。

  2. 减少插入和更新操作的性能损失:由于二级索引并不直接存储表中数据的物理排序顺序,因此在插入和更新数据时,不需要重新排序表数据,减少了性能损失。

二级索引的缺点如下:

  1. 占用更多的磁盘空间:由于二级索引需要存储索引值和指向表中数据的指针,因此需要占用更多的磁盘空间。

  2. 范围查询性能较低:由于二级索引并不直接存储表中数据的物理排序顺序,因此在进行范围查询时,需要使用指针访问表中的实际数据,增加了磁盘I/O操作,性能较低。

3、联合索引

联合索引(Composite Index)是一种包含多个字段的索引类型,它可以加速查询操作中涉及到联合字段的查询,避免了使用多个单字段索引的性能问题。

联合索引的优点如下:

  1. 提高查询效率:由于联合索引包含多个字段,因此在查询时可以同时使用多个字段进行匹配,减少了查询的次数,提高了查询效率。

  2. 减少索引占用空间:由于联合索引包含多个字段,因此可以将多个单字段索引合并为一个联合索引,减少了索引占用的空间。

联合索引的缺点如下:

  1. 增加索引维护成本:由于联合索引包含多个字段,因此在插入和更新数据时,需要同时更新多个字段的索引,增加了索引维护的成本。

  2. 不利于范围查询:由于联合索引包含多个字段,因此在进行范围查询时,只有第一个字段可以被用于范围查询,其他字段只能用于精确匹配,不利于范围查询。

二、迭代过程

(需要将硬盘上的数据通过 Io 加载到内存中,判断是否是我们需要查找的数据,后再放回,后重新查询)

1、二叉树

查询:id=2的时候,需要 io 2次

           id=10的时候,需要 io 5次

在极端情况下,会出现 查询不同数据 需要的Io次数不同,相差甚远,所以为了避免 这种不稳定情况,优化为平衡二叉树

2、平衡二叉树

查询:id=2的时候,需要 io 3次

           id=10的时候,需要 io 3次

相对于二叉树,大大降低了不同数据查询时的Io次数的一个性能差距,但,相对而言,数据多了以后,依然会出现Io上百次的情况,所以为了避免 这种情况,优化为B-tree(B-树)

3、Btree(B树)

B树(B-tree)是一种常见的数据结构,用于实现索引。B树是一种平衡树,每个节点包含多个关键字,并且具有多个子节点。

B树的基本结构如下:

每个节点最多包含m个关键字,最少包含$\lceil\frac{m}{2}\rceil$个关键字(其中$\lceil x\rceil$表示不小于x的最小整数)。

每个节点拥有m+1个子节点,除了叶子节点外,所有节点至少有$\lceil\frac{m+1}{2}\rceil$个子节点。

关键字按升序排列。

所有叶子节点在同一层级上,且不包含指向其他节点的指针。

B树的插入和删除操作会改变树的结构,以保持平衡。当一个节点被插入或删除后,如果它的关键字数量超过了m,就需要进行节点分裂操作,将节点分成两个节点。

B树的查询操作非常高效,平均情况下的时间复杂度为O(log n),其中n是节点数量。因为B树每个节点都包含多个关键字,每次查询可以同时匹配多个关键字,从而减少了查询的次数。

4、B+tree(B+树)

B+树(B+ tree)是一种常见的数据结构,也用于实现索引。B+树是一种基于B树的变体,与B树相比,B+树在内部节点上只存储索引关键字,而不存储数据,所有数据都保存在叶子节点中。

B+树的基本结构如下:

每个节点最多包含m个关键字,最少包含$\lceil\frac{m}{2}\rceil$个关键字。

每个节点拥有m个子节点,除了叶子节点外,所有节点至少有$\lceil\frac{m}{2}\rceil$个子节点。

所有叶子节点在同一层级上,并且按照关键字的升序排列,每个叶子节点包含一个指向下一个叶子节点的指针。

B+树的查询操作与B树类似,也是通过关键字进行查找,但查询结果只能在叶子节点中找到。

B+树相比于B树有以下优点:

B+树的内部节点不存储数据,因此内部节点可以存储更多的索引关键字,从而减少了树的高度,提高了查询效率。

B+树的所有数据都保存在叶子节点中,因此可以更好地利用磁盘预读技术,将相邻的叶子节点预读到内存中,减少磁盘I/O操作,提高了查询效率。

B 树和 B+ 树都可以作为索引的数据结构,在 MySQL 中采用的是 B+ 树。

但B树和B+树各有自己的应用场景,不能说B+树完全比B树好,反之亦然。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值