1. B+tree索引
B-tree(Balanced Tree)索引是MySQL最常用的索引类型之一。它使用二叉树来存储索引数据,并且能够快速地定位到需要查找的数据行。B-tree索引有助于优化查询性能和加速数据访问。 MyISAM 和 InnoDB 存储引擎,都使用 B+Tree的数据结构,它相对与 B-Tree结构,所有的数据都存放在叶子节点上,且把叶子节点通过指针连接到一起,形成了一条数据链表,以加快相邻数据的检索效率。
B-Tree是为磁盘等外存储设备设计的一种平衡查找树。 一棵m阶的B-Tree有如下特性:
- 每个节点最多有m个孩子
- 除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。
- 若根节点不是叶子节点,则至少有2个孩子
- 所有叶子节点都在同一层,且不包含其它关键字信息
- 每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)
- 关键字的个数n满足:ceil(m/2)-1 <= n <= m-1
- ki(i=1,…n)为关键字,且关键字升序排序
- Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)
B+Tree相对于B-Tree有几点不同:
- 非叶子节点只存储键值信息;
- 所有叶子节点之间都有一个链指针;
- 数据记录都存放在叶子节点中
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的变体来存储空间数据,并且可以快速地查找空间数据对象。