MySQL 索引与 B+ 树

B+ 树

MySQL Innodb 存储引擎是使用 B+ 树来组织索引的。在介绍 B+ 树以前,先认识一下什么是 B 树,B 树是平衡二叉树,与一般的二叉查找树不同,平衡二叉树首先满足二叉查找树的定义(左子树的键小于根的键,右子树的键大于根的键),其次必须满足任何节点的两个子树的高度最大差为 1。B 树的维护要求插入和更新节点时,通过 1 次或多次左旋和右旋来满足平衡的条件。二叉查找树是否平衡直接影响了查找需要比较的次数。

B+ 树与普通的二叉树不同,它的节点由多个关键字和指向子树的指针组成,指向子树的指针个数等于关键字个数加 1,这些子树中关键字的范围由它的父节点限定,真正的数据部分是存放在叶子节点中的。MySQL 中页数据结构就是这些叶子节点,每个叶子节点对应了一个 Page,而 Page 的数据结构中有 PAGE_PREV 和 PAGE_NEXT 两个指针,因此这些叶子节点两两之间也是相互连接的。

B+ 树的插入操作

由于 B+ 树需要在插入后依然保证平衡,因此插入操作会涉及到页的拆分操作。Index Page 指的是非叶子结点而 Leaf Page 指的是叶子节点。插入操作分为以下三种情况:

当 Index Page 和 Leaf Page 都不满时,直接将记录插入到叶子节点中。

当 Index Page 不满,Leaf Page 满时,先将节点放入对应 Page,以中间节点作为依据,将 Page 拆分,然后将中间节点放入 Index Page 中,拆分后的左右记录分别放在中间节点的左右两边。

当 Index Page 和 Leaf Page 都满了,先拆分 Leaf Page,然后再拆分 Index Page,拆分 Index Page 的方法与拆分 Leaf Page 的方法一样。

此处需要注意:为了在可能地情况下减少页的拆分操作,B+ 树提供了类似二叉平衡树的旋转操作。旋转操作发生在 Leaf Page 已经满,但是其左右兄弟节点没有满的情况下。

B+ 树的删除操作

B+ 树使用填充因子来控制树的变化,即中间节点关键字的数量和叶子节点关键字的数量和最大值的比例关系。此处以填充因子为 50% 为例。小于填充因子即为小于总容量的一半。删除操作可以分为以下三种情况:

当 Leaf Page 关键字个数和 Index Page 节点关键字的个数都不小于填充因子时,直接将记录从 Leaf Node 中删除,如果该节点为 Index Page 节点,那么将 Index Page 节点替换为其右节点。

当 Leaf Page 关键字个数小于而 Index Page 不小于填充因子时,将 Leaf Page 节点和其兄弟节点合并,同时更新 Index Page 节点。

当 Leaf Page 关键字个数和 Index Page 节点关键字的个数都小于填充因子时,在情况 2 的基础上还需要合并 Index Page 节点。

索引

索引在 MySQL 中就是使用 B+ 树实现的,不同索引之间形成的 B+ 树也是不同的。

聚集索引

聚集索引就是根据主键来构造 B+ 树,叶子节点存放对应页的行记录。

辅助索引(非聚集索引)

辅助索引就是使用非主键构造的 B+ 树,叶子节点存放的是对应的键值以及相应的聚集索引键。通过辅助索引来搜索一般是两级的,第一级找到键值对应的聚集索引键,第二级是根据聚集索引键寻找行记录。

联合索引

联合索引就是对表上的多个列进行索引,这样构造的 B+ 树的 Index Node 和 Page Node 包含多个键。

索引覆盖

在联合索引的情况去搜索行记录,假设需要的行记录的列正好包含在联合索引中,那么此时结果将可以直接从联合索引中得到,省去了从聚集索引中搜索,由于不包含整行的记录所以可以大大减少 IO。

不使用索引的情况

当查询满足条件的行的所有列时,MySQL 不使用辅助索引,而是直接使用聚集索引。原因是即使使用了辅助索引,还是必须通过叶子节点中的目录进行聚集索引的查找,才能得到完整的信息,那么直接从聚集索引中获取即可。

mysql 联合索 B 树_MySQL 索引与 B+ 树相关推荐

  1. mysql 联合主键优缺点_mysql索引的类型和优缺点

    mysql索引的类型和优缺点 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针. 注:[1]索引不是万能的!索引可以加快数据检索操作,但 ...

  2. mysql 二叉树表设计_Mysql 索引模型 B+ 树详解

    一.认识二叉树 首先,在了解 mysql 中的 B+ 树之前,我们需要搞懂什么是二叉树.二叉树是一种常见的非线形数据结构,数据是以一对多的形态组织起来的,我画了一张图来帮助你理解: 在二叉树中,有一种 ...

  3. MySQL的高阶学习:索引、B+树

    Mysql高频面试题(后端大数据面试必备)_mysql高级面试题_南潇如梦的博客-CSDN博客 1.索引 索引是一种数据结构,如果没有索引,查找一个数据就需要从第一页开始全局检索直至找到需要的数据,有 ...

  4. mysql code name作为字段_MySQL索引管理及执行计划

    一.索引介绍 1.什么是索引  1)索引就好比一本书的目录,它能让你更快的找到自己想要的内容. 2)让获取的数据更有目的性,从而提高数据库检索数据的性能. 2.索引类型介绍 1)BTREE:B+树索 ...

  5. mysql更新索引不影响业务_mysql索引更新要多久

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是 ...

  6. mysql联合索失效_mysql 联合索引生效的条件、索引失效的条件

    1.联合索引失效的条件 联合索引又叫复合索引.两个或更多个列上的索引被称作复合索引. 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引 ...

  7. mysql联合索失效_mysql联合索引注意事项,解决为啥联合索引无效的问题

    在数据查询的时候合理利用索引才更好地提高查询效率.今天遇到一个数据量不算太大(1000万左右)的表,但是查询特别慢,建立了userid,logtype,fromid 发现索引无效,查阅相关资料后发现联 ...

  8. mysql组合索最左_MySQL组合索引和最左匹配原则

    可以看到该查询使用到了索引 EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk' and age = 8; 可以看到该查询使 ...

  9. mysql用索性的好处_MySql索引的优缺点

    优点 有了索引.对于记录数量很多的表,可以提高查询速度. 缺点 索引是占用空间的. 索引会影响update insert delete速度 ALERT!!! 1.索引要创建在where和join用到的 ...

最新文章

  1. jQuery中终止Ajax请求
  2. 概述 互联网时代的商业挑战
  3. Kotlin进行异步操作
  4. 【LeetCode笔记】56. 合并区间(Java、排序)
  5. java十进制转十六进制
  6. 90-20-010-源码-调试-Kylin-2.6.0源码调试
  7. 查看ELK集群的状态命令
  8. CE6870 添加ipv6 策略路由失败问题解决
  9. 联想教育应用使用说明(7.6版本号)——第4章 网络控制工具的使用
  10. CS188-Project 4
  11. JavaWeb 图书管理系统
  12. 面试经典-你为什么觉得自己能够在这个职位上取得成就?
  13. Linux中的0.0.0.0和 ::
  14. android 渐变的背景色,Android背景渐变xml
  15. 中断系统与定时/计数计时器
  16. 源代码、明日边缘、土拔鼠之日有感-实践、反馈与重新认识
  17. CS:APP二进制炸弹phase5
  18. 信息化 vs 数字化
  19. JSOI2014骑士游戏(最短路)
  20. 产品宣传手册是如何制作的?

热门文章

  1. R语言实战应用精讲50篇(二十五)-时空数据统计模型:确定性预测模型
  2. 万物之始正则表达式全解析三部曲(中篇)-正则表达式运算符优先级及匹配规则
  3. 集众家之所长,你工作中遇到的可视化问题,如何在 Tableau 官网提交 Case?
  4. 模板使用自定义类型_「Shopify模板」Shopify模板编辑Shopify模板代码更改教程
  5. Python编程基础:第十节 while循环While Loops
  6. 用最少的机器支撑万亿级访问,微博6年Redis优化历程
  7. 机器学习算法基础——k近邻算法
  8. 【采用】解读消金业务风控模型的6个层级
  9. C语言中嵌入正则表达式
  10. 大数据变现四种途径,如何把海量数据变成现金?