目录
一、索引分类
1、聚簇索引
聚簇索引(Clustered Index)是一种特殊的索引类型,它定义了表中数据的物理排序顺序,并将表数据按照索引的顺序存储在磁盘上。
聚簇索引只能在一个表上建立一个,它通常是主键或唯一键索引。当聚簇索引存在时,表数据存储在聚簇索引的叶子节点中,因此聚簇索引也被称为主键索引或聚集索引。
聚簇索引的优点如下:
-
提高查询效率:由于聚簇索引定义了表中数据的物理排序顺序,因此在查询时可以直接使用索引定位到数据所在的磁盘块,并访问连续的数据块,减少了磁盘I/O操作,提高了查询效率。
-
提高范围查询效率:由于聚簇索引将表数据按照索引的顺序存储在磁盘上,因此在进行范围查询时,可以更快地定位到数据所在的磁盘块,并访问连续的数据块,减少了磁盘I/O操作,提高了查询效率。
-
减少磁盘空间使用:由于聚簇索引将表数据按照索引的顺序存储在磁盘上,因此可以减少数据存储空间的使用,提高存储效率。
聚簇索引的缺点如下:
-
插入操作性能较低:由于聚簇索引会改变表数据的物理排序顺序,因此在插入新数据时,需要重新排序表数据,并将数据插入到正确的位置上,因此插入操作的性能较低。
-
更新操作性能较低:由于聚簇索引会改变表数据的物理排序顺序,因此在更新数据时,需要重新排序表数据,并将数据更新到正确的位置上,因此更新操作的性能较低。
2、二级索引(辅助索引、非聚簇索引)
二级索引(Secondary Index),也称为辅助索引(Non-Clustered Index)或非聚簇索引,是一种用于加速数据库查询操作的索引类型。
与聚簇索引不同,二级索引并不直接存储表中数据的物理排序顺序,而是存储索引值和指向表中数据的指针。在查询时,MySQL先使用二级索引定位到表中符合条件的记录,然后再使用指针访问表中的实际数据。
二级索引的优点如下:
-
提高查询效率:由于二级索引存储了索引值和指向表中数据的指针,因此在查询时可以先使用二级索引定位到符合条件的记录,然后再使用指针访问表中的实际数据,减少了磁盘I/O操作,提高了查询效率。
-
减少插入和更新操作的性能损失:由于二级索引并不直接存储表中数据的物理排序顺序,因此在插入和更新数据时,不需要重新排序表数据,减少了性能损失。
二级索引的缺点如下:
-
占用更多的磁盘空间:由于二级索引需要存储索引值和指向表中数据的指针,因此需要占用更多的磁盘空间。
-
范围查询性能较低:由于二级索引并不直接存储表中数据的物理排序顺序,因此在进行范围查询时,需要使用指针访问表中的实际数据,增加了磁盘I/O操作,性能较低。
3、联合索引
联合索引(Composite Index)是一种包含多个字段的索引类型,它可以加速查询操作中涉及到联合字段的查询,避免了使用多个单字段索引的性能问题。
联合索引的优点如下:
-
提高查询效率:由于联合索引包含多个字段,因此在查询时可以同时使用多个字段进行匹配,减少了查询的次数,提高了查询效率。
-
减少索引占用空间:由于联合索引包含多个字段,因此可以将多个单字段索引合并为一个联合索引,减少了索引占用的空间。
联合索引的缺点如下:
-
增加索引维护成本:由于联合索引包含多个字段,因此在插入和更新数据时,需要同时更新多个字段的索引,增加了索引维护的成本。
-
不利于范围查询:由于联合索引包含多个字段,因此在进行范围查询时,只有第一个字段可以被用于范围查询,其他字段只能用于精确匹配,不利于范围查询。
二、迭代过程
(需要将硬盘上的数据通过 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树好,反之亦然。