广告
返回顶部
首页 > 资讯 > 数据库 >MySQL 树形索引结构 B树 B+树 - G
  • 526
分享到

MySQL 树形索引结构 B树 B+树 - G

MySQL树形索引结构B树B+树-G 2021-08-06 13:08:36 526人浏览 绘本
摘要

Mysql 树形索引结构 B树 B+树   如何评估适合索引的数据结构 索引的本质是一种数据结构 内存只是临时存储,容量有限且容易丢失数据。因此我们需要将数据放在硬盘上。 在硬盘上进行查询时也就产生了硬盘的I/O操作,而硬盘的I

MySQL 树形索引结构 B树 B+树 - G

Mysql 树形索引结构 B树 B+树

 

如何评估适合索引的数据结构

  • 索引的本质是一种数据结构
  • 内存只是临时存储,容量有限且容易丢失数据。因此我们需要将数据放在硬盘上。
  • 在硬盘上进行查询时也就产生了硬盘的I/O操作,而硬盘的I/O存取消耗的时间要比读取内存大很多。因此数据查询的时间主要决定于I/O操作的次数
  • 每访问一次节点就需要对磁盘进行一次I/O操作

 

树模型

二分查找的时间复杂度是O(log2n),是一种很高效的查询方式。在一系类树种使用二分查找的树有很多,但并不是所有树都适合作为索引的结构。

 

Binary Search Tree 二叉搜索树(BST)

性质:

  • 对任意节点,左子树不为空则左子树所有节点小于或等于该节点的值
  • 对任意节点,右子树不为空则右子树所有节点大于或等于该节点的值

但二叉搜索树不一定是"平衡的",它有可能退化成一条链表,那么他的搜索时间就变成了O(n)。

 

平衡二叉搜索树(AVL)

为了避免退化成一条链表,人们提出了二叉搜索树,AVL在二叉搜索树的基础上增加了约束:

每个节点的左子树和右子树的高度差不能超过1

也就是说要求节点的左右子树仍然为平衡二叉树

常见的平衡二叉树有很多种,包括了AVL树、红黑树、数堆、伸展树。AVL树是最早提出来的自AVL树,当我们提到平衡二叉树时一般指的就是AVL树

左右平衡后就使得搜索时间复杂度能稳定在O(log2n)。

但是即便在理论上它的搜索效率高且比较稳定,但是由于“每访问一次节点就需要进行一次磁盘I/O操作”,在实际情况中只有两个子节点的情况下,树的高度依然有可能会很高,比如说现有一个五层共31个节点的树,那么我们需要进行5次I/O操作。

 

B Tree

既然"二叉"结构可能让树变得很高,那么我们自然而然地就明白可以让子节点数变得更多来减少I/O次数。在文件系统和部分数据库系统中,B树就已经得到了实际的应用。

如图所示,B树有如下性质

  • B树也是平衡的,每个节点可以有M个子节点,M也称为B树的阶

  • 每个磁盘块都包含着关键字和指针,有k-1个关键字,那么就有k个指针,也就是k个子节点。也就等同于子节点的数量=关键字数量+1

  • 所有子节点都在同一层,且每个叶子节点没有子节点,只包含k-1个关键字

  • 子节点和非子节点都即保存数据记录又保存索引。

  • k-1个关键字相当于划分出了k个范围,每个范围对应一个指针。

    例如,有关键字Key[1], Key[2], …, Key[k-1],且关键字按照升序排序

    它们划分出k个范围对应k个指针,P[1], P[2], …, P[k]

    对应关系就是:P[1]指向关键字小于 Key[1]的子树,P[i]指向关键字属于 (Key[i-1], Key[i]) 的子树,P[k]指向关键字大于 Key[k-1]的子树

在B树上的搜索过程就是:

  • 要找目标关键字n,那么就从根节点开始,不断在树的每一层的每两个相邻关键字划定的范围中寻找包含目标关键字的节点,顺着索引一直寻找,直到某节点中关键字与目标关键字相同。

这里说的关键字在实际的数据库中,其实就是一条实际的数据或者主键值,详细可见此处

mongoDB内部使用的就是B树

 

B+ Tree

主流的RDMS大多采用B+树作为索引结构,包括mysql的InnoDB引擎(不同存储引擎的索引的工作方式并不一样。而即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同)

在数据结构性质上与B树不同的是:

  • 有K个孩子就有k个关键字。通俗来讲,B树是给每一个范围一个指针,而B+树是给每个子节点直接给一个指针。
  • 只有叶子节点保存数据记录,非叶子节点仅用于索引
  • 所有关键字都在叶子节点中。每层子节点的关键字也会保存在下一层子节点中且是子节点关键字中最大或最小的那一个,这样到最后,所有关键字都集合在叶子节点中。
  • 叶子节点之间会按照关键字的大小从小到大,使用双向链表进行串联。支持了区间查询。

 

B+树 vs B树

上面说了两种数据结构性质上的不同,下面里对比下实际生产中两种索引结构的区别。

  • B+树查询效率更稳定

    B+树所有的数据记录都在叶子节点,而B树的数据记录可能在叶子节点也可能在非叶子节点,这样就会导致查询效率的不稳定。

  • B+树查询效率更高

    B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小。那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对io读写次数就降低了。

  • B+树的范围查询效率更高

    B+树所有叶子节点都通过双向链表进行查询,方便范围查询。

    而B树因为在非叶子节点中也存有数据记录,因此范围查询时需要通过对树的中序遍历才能完成

 

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 树形索引结构 B树 B+树 - G

本文链接: https://www.lsjlt.com/news/7007.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL 树形索引结构 B树 B+树 - G
    MySQL 树形索引结构 B树 B+树   如何评估适合索引的数据结构 索引的本质是一种数据结构 内存只是临时存储,容量有限且容易丢失数据。因此我们需要将数据放在硬盘上。 在硬盘上进行查询时也就产生了硬盘的I/O操作,而硬盘的I...
    99+
    2021-08-06
    MySQL 树形索引结构 B树 B+树 - G
  • MySQL索引:B+树索引
    MySQL索引:B+树索引 B+树索引是传统意义上的索引,这是目前关系型数据库系统中查找最为常用和最为有效的索引。B+树索引的构造类似于二叉树,根据键值快速找到数据 B树 B+树是由B树演化而来的,在了解B+树之前,我们需要对B树有一点认...
    99+
    2021-09-01
    MySQL索引:B+树索引
  • B树索引
    https://www.cnblogs.com/xqzt/p/4456746.html    B-Tree索引是最常见的索引结构,默认创建的索引就是B-Tree索引。 一、B树索引的结构 B-树索引是基于二叉树结构的。B-树索引结...
    99+
    2014-08-16
    B树索引
  • B+树索引
    https://www.iteye.com/blog/zhuyuehua-1872202   1.索引结构          1.1 B+树索引结构         从物理上说,索引通常可以分为:分区和非分区索引、常规B树索引、位...
    99+
    2022-04-10
    B+树索引
  • MySQL中B树索引和B+树索引的区别详解
    目录1. 多路搜索树2. B树-多路平衡搜索树3. B树索引4. B+树索引总结如果用树作为索引的数据结构,每查找一次数据就会从磁盘中读取树的一个节点,也就是一页,而二叉树的每个节点...
    99+
    2022-11-13
  • 【mysql】聚簇索引和非聚簇索引(B树和B+树)
    博主简介:想进大厂的打工人博主主页:@xyk:所属专栏: mysql 目录 一、索引分类 二、索引的数据结构 2.1 B树:改造二叉树 2.2 B+树:改造B树 三、Mysql索引实现—InnoDB引擎 3.1 主键索引(聚簇...
    99+
    2023-09-25
    mysql 数据库 b树 数据结构
  • MySQL中B树索引和B+树索引的区别是什么
    本文小编为大家详细介绍“MySQL中B树索引和B+树索引的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL中B树索引和B+树索引的区别是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。如果用...
    99+
    2023-06-29
  • MySQL索引的数据结构-B+树介绍
    1.聚集索引和辅助索引 在数据库中,B+树的高度一般都在24层,这也就是说查找某一个键值的行记录时最多只需要2到4次IO,这倒不错。因为当前一般的机械硬盘每秒至少可以做100次IO,24次的IO意味着查询时间只需要0.02~0.0...
    99+
    2017-02-08
    MySQL索引的数据结构-B+树介绍
  • MySQL用B+树(而不是B树)做索引的原因
      https://www.jianshu.com/p/7ce804f97967 众所周知,MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢? 先看一下B树和B+树的区别。 1.B树 维基百科对B树的定义为“在计算...
    99+
    2020-03-03
    MySQL用B+树(而不是B树)做索引的原因
  • MySQL中InnoDB索引数据结构(B+树)详解
    mysql的innodb的索引的B+树逐步讲解 B树B+树B树和B+树的不同点聚集索引 VS 非聚集索引总结(面试题)1.为什么不使用二叉查找树?2.为什么不使用平衡二叉树?3.为什么不使用B树?4.为什么MySQL选择B+树做索引...
    99+
    2023-08-17
    b树 数据结构 mysql 数据库
  • 树结构中MongoDb使用的到底是 B 树还是B+树
    这篇文章给大家介绍树结构中MongoDb使用的到底是 B 树还是B+树,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。关于 B 树与 B+ 树,网上有一个比较经典的问题:为什么 Mong...
    99+
    2022-10-18
  • 浅析MySQL索引结构采用B+树的问题
    目录1、B树和B+树2、原因分析3、总结一位6年经验的小伙伴去字节面试的时候被问到这样一个问题,为什么mysql索引结构要采用B+树?这位小伙伴从来就没有思考过这个问题。只因为现在都这么卷,后面还特意查了很多资料,他也希...
    99+
    2022-06-21
    mysql 索引B+树 MySQL索引结构
  • MySQL使用B+树作为索引结构的原因
    这篇文章将为大家详细讲解有关MySQL使用B+树作为索引结构的原因,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、二叉查找树(BST):不平衡二叉查找树(BST,Bin...
    99+
    2022-10-18
  • 索引原理及B树索引
    索引原理及B树索引 http://hongyitong.github.io/2017/01/05/%E7%B4%A2%E5%BC%95%E5%8E%9F%E7%90%86%E5%8F%8AB%E6%A0%91%E7%B4%A2%E...
    99+
    2020-03-30
    索引原理及B树索引
  • MySQL-InnoDB为什么采用B+树结构实现索引
    索引的作用是提高查询效率,其实现方式有很多种,常见的索引模型有哈希表、有序列表、搜索树等。 哈希表 一种以key-value键值对的方式存储数据的结构,通过指定的key可以找到对应的value。 哈希把值放在数组里,用一个哈...
    99+
    2018-07-22
    MySQL-InnoDB为什么采用B+树结构实现索引
  • MySQL用B+树作为索引结构有什么好处
    前言 在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作索引结构(这里不考虑hash等其他索引)。本文将从最普通的二叉查找树开始,逐步说明各种树解决的问题以及面临的新问题,从而说明MySQL为什么...
    99+
    2022-05-18
    MySQL 索引结构 MySQL b+树
  • mysql索引采用B+树结构的原因有哪些
    这篇文章将为大家详细讲解有关mysql索引采用B+树结构的原因有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。索引提高查询效率,就像我们看的书,想要直接翻到某一章,是...
    99+
    2022-10-18
  • 浅谈MySQL的B树索引与索引优化小结
    MySQL的MyISAM、InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引结构,理解常见的...
    99+
    2022-10-18
  • 为什么MySQL用B+树做索引
    索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。 索引是一种数据结构,用于帮助我们在大量数据中快速定...
    99+
    2017-02-01
    为什么MySQL用B+树做索引
  • MySQL优化中B树索引知识点总结
    为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太长, 3.或等待时间太长 4.sql语句欠佳,以及我们索引失效 5.服务器参数设置不合理 S...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作