MySQL的索引结构

37 阅读3分钟

1. B+tree索引

B-tree(Balanced Tree)索引是MySQL最常用的索引类型之一。它使用二叉树来存储索引数据,并且能够快速地定位到需要查找的数据行。B-tree索引有助于优化查询性能和加速数据访问。 MyISAM 和 InnoDB 存储引擎,都使用 B+Tree的数据结构,它相对与 B-Tree结构,所有的数据都存放在叶子节点上,且把叶子节点通过指针连接到一起,形成了一条数据链表,以加快相邻数据的检索效率。

B-Tree是为磁盘等外存储设备设计的一种平衡查找树。 一棵m阶的B-Tree有如下特性: 

  1. 每个节点最多有m个孩子 
  2. 除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。
  3. 若根节点不是叶子节点,则至少有2个孩子 
  4. 所有叶子节点都在同一层,且不包含其它关键字信息 
  5. 每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn) 
  6. 关键字的个数n满足:ceil(m/2)-1 <= n <= m-1 
  7. ki(i=1,…n)为关键字,且关键字升序排序
  8. Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)

B+Tree相对于B-Tree有几点不同:

  1. 非叶子节点只存储键值信息;
  2. 所有叶子节点之间都有一个链指针;
  3. 数据记录都存放在叶子节点中

B+树的索引特点

下面详细介绍一些MySQL的B+树索引特点:

1. 多级索引结构

B+树索引使用多级索引结构来存储数据,其中叶节点存储实际的数据行,而非叶节点只存储索引键和指向下一个节点的指针。这种多级索引结构可以大大减少内存开销,并且能够提高查询性能。

2. 范围查找

B+树索引支持范围查找,它可以快速地定位需要查找的数据行,并且在叶节点上进行顺序遍历,以返回符合条件的所有数据行。这种范围查找操作适用于使用“>”、“<”、“between”等运算符的查询语句。

3. 排序操作

B+树索引支持排序操作,它可以利用叶节点上的有序排列来加速排序操作。当执行“order by”语句时,MySQL可以直接从B+树索引中获取有序数据,而无需进行额外的排序操作。

4. 聚簇索引

B+树索引还可以用作聚簇索引,这意味着数据行将按照索引键的顺序存储在硬盘上,以提高查询性能和加速数据访问。聚簇索引适用于范围查找和排序操作频繁的应用场景。

5. 索引覆盖

B+树索引还支持索引覆盖,这意味着MySQL可以直接从索引中获取需要查询的数据,而无需访问实际的数据行。当使用“select”语句时,MySQL可以利用索引覆盖来减少磁盘I/O和内存开销,以提高查询性能。

2. Hash索引

Hash索引使用哈希表来存储索引数据,它将关键字转换为哈希值,并且可以直接从哈希表中获取需要查找的数据行。Hash索引适合进行等值比较查询,但不支持范围查询或排序操作。

MySQL目前有Memory引擎和NDB引擎支持Hash索引。

3. Full-Text索引

Full-Text索引允许在文本字段中进行全文搜索,它使用特殊的算法来对文本内容进行分词和匹配。Full-Text索引适合于需要进行全文搜索的应用场景。

4. R-Tree索引

R-Tree索引用于存储空间数据类型,例如地理位置信息、图片或视频等。它使用B-tree的变体来存储空间数据,并且可以快速地查找空间数据对象。