讲到索引,第一反应肯定是能提高查询效率。例如书的目录,想要查找某一章节,会先从目录中定位。如果没有目录,那么就需要将所有内容都看一遍才能找到。

索引的设计对程序的性能至关重要,若索引太少,对查询性能受影响;而如果索引太多,则会影响增/改/删等的性能。

知识点

MySQL中一般支持以下几种常见的索引:

  • B+树索引
  • 全文索引
  • 哈希索引

我们今天重点来讲下B+树索引,以及为什么要用B+树来作为索引的数据结构。

B+树索引并不能直接找到具体的行,只是找到被查找行所在的页,然后DB通过把整页读入内存,再在内存中查找。

重温数据结构

1.1 哈希结构

如有 3、1、2、10、9、0、4、6这8个数据,建立如 图1-1所示哈希索引。

  • 直接查询:现在要从8个数中查找6这条记录,只需要计算6的哈希值,便可快速定位记录,时间复杂度为O(1)。
  • 范围查询:如果要进行范围查询(大于4的数据),那这个索引就完全没用了。

1.2 二叉树查找树

二叉树是一种经典的数据结构,要求左子树小于根节点,右子树大于根节点。

如有 3、1、2、10、9、0、4、6这8个数据,建立如 图1-2所示二分查找树。

  • 直接查询:假设查找键值为6的记录,先找到根4,4<6,因此查找4的右子树,找到9;9大于6,因此查找9的左子树;一共查找3次。但如果顺序查找,则需要查找8次(位于最后)。
  • 范围查询:如果需要查找大于4的数据,则遍历4的右子树就行了

1.3 平衡二叉树(AVL树)

按照二叉查找树的定义,它是可以任意的构造,同样是这些数字,可以按照 图1-3-1的方式来建立二叉查找树。同样查找数据6,需要查找5次。

图1-3-1 性能较差的二叉查找树

因此为了最大性能地构造一个二叉查找树,需要它是平衡的,即平衡二叉树。

平衡二叉树定义:首先符合二叉查找树的定义,另外任何节点的两个子树高度最大差为1。

平衡二叉树的查询速度是很快的,但是有缺点:

  1. 维护树的代价是非常大,在进行插入或更新时,经常会需要多次左旋或右旋来维持平衡。如 图1-3-2所示
  2. 数据量多的时候,树会很高,需要多次I/O操作。
  3. 在进行范围查找时,假设查找>=3,先找到3,然后需要查找到3的父节点,然后遍历父节点的右子树。

1.4 B+ 树

在B+树中,所有记录节点存放在叶子节点上,且是顺序存放,由各叶子节点指针进行连接。如果从最左边的叶子节点开始顺序遍历,能得到所有键值的顺序排序。

如有 3、1、2、10、9、0、4、6这8个数据,可建立如图1-4-1所示高度为2的B+树。

 图1-4-1 高度为2的B+树

在进行更新时,B+树同样需要类似二叉树的旋转操作。举例,假设新增一个7,那可以直接填充到4、6的后面。如果再添加8,那么就需要进行旋转了,感受下面的B+树旋转过程。

图1-4-2 高度为3的B+树

采用B+树的索引结构优点:

  1. B+树的高度一般为2-4层,所以查找记录时最多只需要2-4次IO,相对二叉平衡树已经大大降低了。
  2. 范围查找时,能通过叶子节点的指针获取数据。例如查找大于等于3的数据,当在叶子节点中查到3时,通过3的尾指针便能获取所有数据,而不需要再像二叉树一样再获取到3的父节点。

看到这应该明白mysql索引为什么使用B+树了吧

转载于:https://www.cnblogs.com/CQqf2019/p/10929449.html

图解对比MySQL索引为什么要用B+树相关推荐

  1. mysql索引为啥要选择B+树 (下)

    有读者在 mysql索引为啥要选择B+树 (上) 上篇文章中留言总结了选择 B+ 树的原因,大体上说对了,今天我们再一起来看看具体的原因. 索引为什么要保存在硬盘中 首先要明白几个概念,服务器存储一般 ...

  2. Mysql索引数据结构有多个选择,为什么一定要是B+树呢?_面试 (MySQL 索引为啥要选择 B+ 树)

    Mysql索引数据结构 下面列举了常见的数据结构 二叉树 红黑树 Hash表 B-Tree(B树) Select * from t where t.col=5 我们在执行一条查询的Sql语句时候,在数 ...

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

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://tinyurl.com/y5ymnj9a 一. ...

  4. 图解 MySQL 索引:B-树、B+树,终于搞清楚了!

    看了很多关于索引的博客,讲的大同小异.但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引-. 或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结 ...

  5. 图解MySQL索引:B-树(B+树)

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 作者:浪人 ...

  6. mysql系列十、mysql索引结构的实现B+树/B-树原理

    一.MySQL索引原理 1.索引背景 生活中随处可见索引的例子,如火车站的车次表.图书的目录等.它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的 ...

  7. mysql索引为啥要选择B+树 (上)

    不知道你有没有这种感觉,那些所谓的数据结构和算法,在日常开发工作中很少用到或者几乎不曾用到,可能只是在每次换工作准备面试的时候才会捡起来学习学习. 那我希望今天这篇文章能让你对数据结构的具体应用能有个 ...

  8. 面试官:MySQL索引为什么要用B+树实现?

    原因如下 B+树能显著减少IO次数,提高效率 B+树的查询效率更加稳定,因为数据放在叶子节点 B+树能提高范围查询的效率,因为叶子节点指向下一个叶子节点 B+树是怎么来的? 在从一堆数据中查找指定的数 ...

  9. MySQL索引优化实战

    在列上进行运算或使用函数会使索引失效,从而进行全表扫描.如下面例子在publish_time,id列上分别加上索引,publish_time为datetime类型,id为int类型 -- 全表扫描 s ...

  10. MySQL 索引底层数据结构实现

    文章目录 概述 讨论范围 查询数据结构 查询数据结构种类及其高性能查询原理 MySQL 索引的底层数据结构 MySQL 索引的需求分析 选择 MySQL 索引的底层数据结构 B- 树和 B+ 树的对比 ...

最新文章

  1. 图论-最短路径--3、SPFA算法O(kE)
  2. 实体链接中使用实体一致性信息(coherence)
  3. matlab解决多旅游商问题,多旅行商问题的matlab程序
  4. 图像矫正与车牌识别资料整理
  5. 重庆python培训-重庆Python培训班学完能做什么
  6. C语言中| 按位或, || 逻辑或。
  7. vs2010利用属性表自动配置OpenCV(win7的64位系统,opencv版本是2.4.10)
  8. 五:CentOS7安装出现Warning
  9. python里while的用法_Python学习笔记之While循环用法分析
  10. Git如何创建本地分支并推送到远程仓库
  11. java设计智慧教室_物联网智慧教室设计方案,更便捷的智慧教学体验
  12. php显示网络图片,PHP在服务器端怎么显示图片呢?
  13. 金蝶记账王和KIS迷你版的区别
  14. AVR单片机教程——DAC
  15. mysql实验感想_数据库原理实验心得
  16. DSQLTools的使用——合天网安实验室学习笔记
  17. 【禁用U盘】电脑windows7/10注册表、组策略禁用优盘;
  18. TIA博途中CPU固件版本和实际PLC不同时如何进行程序的下载?
  19. 最薄的 4K 雷电 3 显示器 — ThinkVision X1 (2nd Gen) 长测
  20. 数显之家快讯:【SHIO世硕心语】华为内部考核尺度爆光!

热门文章

  1. Spring IOC源码笔记(二)
  2. 并发编程学习之Condition和顺序访问
  3. spring aop聊点不一样的东西
  4. SpringBoot中的Aop优先使用的是JDK动态代理还是Cglib
  5. 关于建立内部会议讨论规范的想法
  6. iOS----UIScrollView
  7. Linux下的tar命令
  8. 让Windows 7安装更快速.
  9. [Java][Android][Process] 分享 Process 执行命令行封装类
  10. 单链表逆置-java(递归与非递归)