假设有一个表index_demo,表中有2个INT类型的列,1个CHAR(1)类型的列,c1列为主键:

- 表示记录的类型, 0是普通记录、 2是最小记录、 3 是最大记录、1是B+树非叶子节点记录。
- 表示下一条记录的相对位置,我们用箭头来表明下一条记录。
- 这里只记录在 index_demo 表中的三个列,分别是 c1 、 c2 和 c3 。
- 除了上述3种信息以外的所有信息,包括其他隐藏列的值以及记录的额外信息。
将项暂时去掉并把它竖起来的效果就是这样:


,因此数据存储在磁盘中,可能会占用多个数据页。如果各个页中的记录没有规律,我们就不得不依次遍历所有的数据页。,我们可以这样做 :
- 下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值
- 给所有的页建立目录项

以为例,它对应 ,这个目录项中包含着该页的以及该页中用户记录的。我们只需要把几个目录项在物理存储器上连续存储(比如:数组),就可以实现根据主键值快速查找某条记录的功能了。
- 先从目录项中根据二分法快速确定出(因为 12 ≤ 20 < 209 ),。
- 再到页9中根据二分法快速定位到主键值为 20 的用户记录。
至此,针对数据页做的简易目录就搞定了。这个目录有一个别名,称为 。
我们新分配一个编号为30的页来专门存储,页10、28、9、20专门存储:


- 目录项记录 的 record_type 值是1,而 普通用户记录 的 record_type 值是0。
- 目录项记录只有主键值和页的编号两个列,而普通的用户记录的列是用户自己定义的,包含很多列,另外还有InnoDB自己添加的隐藏列。
- 先到页30中通过二分法快速定位到对应目录项,因为 12 ≤ 20 < 209 ,就是页9。
- 再到页9中根据二分法快速定位到主键值为 20 的用户记录。
更复杂的情况如下:
我们生成了一个存储更高级目录项的 页33 ,这个页中的两条记录分别代表页30和页32,如果用户记录的主键值在 之间,则到页30中查找更详细的目录项记录,如果主键值 不小于320 的话,就到页32中查找更详细的目录项记录。这个数据结构,它的名称是 B+树 。

B+树是一种多路平衡搜索树,它的特点包括:
- 多路平衡:多路指的是树中每个节点可以有多个子节点,平衡则是指树的高度相对均衡,以确保查找效率。
- 节点结构:在B+树中,非叶子节点只存储索引信息(即键值),而叶子节点则存储实际的数据记录。所有叶子节点都在同一层,且叶子节点之间通过链表相连。
- 磁盘友好:B+树的设计考虑了磁盘读写效率,每个节点的大小通常等于一个磁盘页的大小(如InnoDB中的默认页大小为16KB)。这样,每次磁盘I/O操作可以读取或写入一个节点的全部内容,减少了磁盘访问次数。
- 当执行查询操作时,MySQL会根据查询条件在B+树中查找对应的记录。
- 首先,从根节点开始,根据键值比较确定查找方向,进入相应的子节点。
- 重复上述过程,直到到达叶子节点。
- 在叶子节点中,通过线性查找(或二分查找,如果叶子节点内的记录已排序)找到符合条件的记录。
- 插入新记录时,MySQL会首先找到应该插入的叶子节点。
- 如果叶子节点有空闲空间,则直接插入;否则,会进行节点分裂,将部分记录分裂到新的节点中,并更新父节点的索引信息。
- 删除记录时,MySQL会找到包含该记录的叶子节点,并将其删除。
- 如果删除后叶子节点中的记录数过少(低于某个阈值),则可能会进行节点合并或重新平衡操作,以保持B+树的平衡性。
假设有一个名为employees的表,包含以下字段:id(员工ID,主键)、name(员工姓名)、age(员工年龄)、department(员工所属部门)。
等值查询:查询名字为"Alice"的员工信息。
MySQL会利用idx_name索引快速定位到名字为"Alice"的记录。
范围查询:查询年龄在25到30岁之间的员工信息。
MySQL会利用idx_age索引快速定位到年龄在指定范围内的记录。
排序查询:按照年龄升序查询所有员工信息。
MySQL会利用idx_age索引进行快速排序。
- 查询效率高:由于B+树的高度相对较低,查找、插入和删除操作的效率都较高。
- 磁盘读写效率高:每个节点的大小等于磁盘页的大小,减少了磁盘访问次数。
- 支持范围查询和排序:B+树的叶子节点通过链表相连,支持高效的范围查询和排序操作。
- 索引维护成本:索引需要占用额外的存储空间,并在插入、删除和更新操作时进行维护。
- 选择合适的索引列:应根据查询需求选择合适的索引列,避免创建冗余索引。
- 索引失效:在某些情况下(如使用函数、隐式类型转换等),索引可能会失效,导致查询性能下降。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/18876.html