图解MySQL索引:B-树、B+树

什么是索引?

索引是一种帮助MySQL高效访问数据的数据结构。

索引能做什么?

提高数据查询效率。

索引:排序数据结构,用于快速搜索!索引影响搜索的起始位置和顺序。

与存储结构不同:BTree索引(B-Tree或B+Tree索引)、Hash索引、Full-Index全文索引、R-Tree索引。
按应用级别分为:普通索引、特殊索引、复合索引。
根据数据的物理顺序和键值关系的逻辑(索引)顺序:聚集索引、非聚集索引。

普通索引:即一个索引只包含一列,一个表可以有多个单列索引。

唯一索引:索引列值必须唯一,但允许空值。

复合索引:即索引包含多个列。

聚簇索引:不是一个单独的索引,而是一种数据存储机制。
具体细节取决于应用。

非聚集索引:要么是聚集索引,要么是非聚集索引(重脸)。

哈希索引

基于哈希表的实现,只有匹配所有索引列的查询才会被执行到索引中,并在每一行上放置指针。
索引表中的数据。

B-Tree索引(MySQL使用B+Tree)

B-Tree可以加快数据访问速度,因为存储引擎需要进行全表扫描来查找数据。
它分布在不同的节点之间。

B+Tree索引

它是B树的修改版本,是数据库索引使用的存储结构。
数据全部在叶子节点上,并且添加了串行访问指针。
与B-Tree相比,在进行范围搜索时,只需要找到两个节点并遍历它们即可。
虽然B-Tree需要访问所有节点,但B+Tree效率更高。

结合存储引擎讨论(一般默认使用B+Tree)

案例:假设有一张学生表,以id为主键。

在MyISAM引擎中实现(第二个索引也是这样实现的)

InoDB中的实现

插入连续数据:

插入非顺序数据

为什么索引结构默认是B-Tree而不是Hash、二叉树、红黑树?Hash:虽然可以快速存储,但是没有顺序,IO复杂度较高。
二叉树:树的高度不均匀,不能自身平衡,搜索效率与数据(树的高度)有关,IO成本高。
红黑树:随着数据量的增加,树的高度增加,IO值高。

为什么官方推荐使用自增主键作为索引?结合B+Tree特性,自增主键连续,输入过程中减少页面碎片。
并且可以减少数据移动,每个槽都插入到最后。
简而言之,就是减少分割和移动的频率。

图解MySQL索引:B-树、B+树

理解MySQL索引的关键在于对B-Tree和B+Tree的深入分析。
这些复杂的数据结构对于提高查询效率至关重要。
本文的目的是阐明索引的基本概念和分类,以便您在面试时能够准确回答相关问题。
索引是一种数据结构,其主要作用是提高查询数据的效率。
相当于排序后的快速查找工具,影响WHERE子句查询的速度和ORDERBY排序的性能。
索引通常分为以下几类:一是按照存储结构有BTree(B-Tree或B+Tree)、Hash、全文索引和R-Tree;二是按照应用层次;这些是普通索引(单列)、唯一索引Index(唯一值,允许空值)和复合索引(多列的组合),再根据数据的物理顺序和逻辑顺序,还有聚集索引();B+TreeInnoDB结构包含数据)和非聚集索引(数据和索引分开存储)。
在基本实现中,哈希索引依赖于哈希表,但只有完全匹配所有列的查询才有效,而B-Tree(MySQL使用B+Tree)通过分布节点存储来提高搜索效率。
InnoDB中的B+Tree索引进一步优化,将数据集中在叶子节点上,增加顺序访问指针,降低范围查询的复杂度。
至于为什么B树不像其他结构,最主要的原因是B树的平衡性和连续性。
哈希索引虽然速度快,但不是顺序的,I/O复杂;二叉树高度不均匀,红黑树数据量增大,树高增大,这些都会影响性能。
自增主键作为索引,由于其连续性,可以有效避免分页和数据移动,同时也提高了插入效率。