关于对索引底层数据结构的理解

这篇具有很好参考价值的文章主要介绍了关于对索引底层数据结构的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

我们在谈论索引底层的数据结构之前,我们不妨先想一下索引是什么以及索引存在的作用

Hash

二叉搜索树与二叉平衡树

多叉平衡查找树(B树)

B+树


我们在谈论索引底层的数据结构之前,我们不妨先想一下索引是什么以及索引存在的作用

索引:是一种特殊的文件,包含着对数据库表中所有记录的引用指针,而其的作用也体现的很明确了,我们通过创建索引来达到提高查询效率的目的(创建索引需要一定的空间,而索引的出现是典型空间换时间策略的体现),每种不同的索引均采用了不同的数据结构

Hash

hash的插入和删除效率很高,在大多数情况下能达到O(1)的时间复杂度,但是mysql数据库并没有选择这种数据结构,为什么呢?我们不妨去思考,虽然其时间复杂度很低,但对于hash而言,其创建和添加数据并不是通过排序和比较的方式,所以他不支持做范围查询,大于号小于号 between and 这种操作,是不支持的

二叉搜索树与二叉平衡树

关于对索引底层数据结构的理解

相对于hash这种数据结构而言,虽然它能够实现范围查询,其查找的时间复杂度也相对较低(logN),但是我们不妨去想一下,数据库采用所以的目的是为了降低多次IO操作所产生的的时间效率,对于二叉搜索树而言,每一层2^n-1(n>=0)个结点,也就是说,随着树越来越高,其IO操作所消耗的时间成本仍然很高,除此之外,二叉搜索树很容易出现的一种情况是出现斜树问题,即所有的结点出现在二叉树的同一侧,在这种情况下使IO的时间复杂度陡然增加,因此引入平衡二叉树

平衡二叉树(AVL)

平衡二叉树具有二叉搜索树的所有特点,除此之外,它新增了一个规则:所有树的左右结点的高度差的绝对值不能超过1,通过左旋和右旋的方式实现平衡,但是其仍然无法解决存在大量结点时出现的树高过多而导致的时间复杂度过高的问题

关于对索引底层数据结构的理解

多叉平衡查找树(B树)

关于对索引底层数据结构的理解

为了解决树高很高的问题,后来出现了多叉树,同一层能够储存多个节点,很大程度上解决了二叉搜索树所存在的问题,虽然多叉树时间效率相对较高且支持范围查询,mysql并没有选择它,而是在他的基础上进行了优化,选择了B+树

B+树

关于对索引底层数据结构的理解

我们去说一下B+树的过人之处:

1.B+树通过一层多个节点的引用,控制了树的高度,减少了IO次数,提高了时间效率

2.相对于B树而言,mysql的B+树采用了双向循环列表并且有序,支持范围查询且时间效率较高

3.相对于B树,其每个节点值都在叶子结点上,在同一层进行查询操作,性能相对均衡,也就是在控制树高的情况下,其性能是可控的。

4.只有叶子页点存储了真实完整的数据,非叶子页点,只能了主键(索引)的值和子节点的引用文章来源地址https://www.toymoban.com/news/detail-490479.html

到了这里,关于关于对索引底层数据结构的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql性能调优——1.深入理解Mysql索引数据结构和算法

    本系列所说的Mysql性能调优,主要是针对开发者在实际环境中的sql调优,代码层面上的优化。不涉及到mysql底层代码的调优。 我们知道,一个mysql数据表,数据量小的时候,可能简单的查询耗时不会太久,性能也可以接受。但当数据量大的时候,查询速度会很缓慢。这时候我们

    2024年02月09日
    浏览(28)
  • (三)ElasticSearch核心知识理解(目录结构,索引,RESTful)

    bin:包含 Elasticsearch 的可执行文件,如 elasticsearch(用于启动 Elasticsearch)、elasticsearch-plugin(用于管理插件)等。 config:包含 Elasticsearch 的配置文件。 elasticsearch.yml:主要的配置文件,用于配置 Elasticsearch 的各种设置,如集群名称、节点设置、网络配置等。 jvm.options:用于配

    2024年02月11日
    浏览(35)
  • 【数据结构】哈希底层结构

    目录 一、哈希概念 二、哈希实现 1、闭散列 1.1、线性探测 1.2、二次探测 2、开散列 2.1、开散列的概念 2.2、开散列的结构 2.3、开散列的查找 2.4、开散列的插入 2.5、开散列的删除 3、性能分析  顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查

    2024年02月06日
    浏览(34)
  • 【数据结构】HashSet的底层数据结构

    🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Set 系列集合 无序:存取顺序不一致 不重复:可以去除重复 无索引:没有带索引的方法,所以不能使用普通fo循环遍历,也不能通过索引来获

    2024年03月16日
    浏览(42)
  • Redis五种数据结构底层编码结构

    Redis中的 任意数据类型的键和值都会被封装为一个RedisObject ,也叫做Redis对象,源码如下: 对象头不包含数据就已经占16字节,如果数据存string型,一个string一个对象头比较浪费空间,存大量数据时还是建议使用集合,这样可以共用一个对象头更加节省空间 Redis中会根据存储

    2024年02月11日
    浏览(27)
  • Redis - 底层数据结构

    Redis 的底层数据结构主要以下几种: SDS(Simple Dynamic String, 简单动态字符串) ZipList(压缩列表) QuickList(快表) Dict(字典) IntSet(整数集合) ZSkipList(跳跃表) 在 Redis 中,并不会直接使用 C 语言自带的字符串结构作为实际的存储结构,而只是将字符串作为字面量使用,大多数情况使用自

    2023年04月12日
    浏览(33)
  • MySQL底层数据结构

    一个sql语句在mysql中究竟是如何运行的?又应该通过怎样的方式去查找我们要找的数据?这里就涉及到几种存储数据的算法; 可以做索引的数据结构有数组、链表、二叉搜索树和B树(B-树、B+树)。 2.1、HASH 由于HASH查询和写入的时间复杂度是O(1),这意味着只需要一次hash计算就

    2024年02月08日
    浏览(31)
  • Redis底层数据结构

    SDS全称是Simple Dynamic String,具有如下显著的特点: 常数复杂度获取字符串长度:C语言获取一个字符串的长度需要遍历整个字符串时间复杂度为O(N),而SDS在属性len中记录了字符串长度,获取字符串长度的时间复杂度为O(1)。 杜绝缓冲区溢出:C字符串在执行拼接字符串时,如果

    2024年02月13日
    浏览(30)
  • redis 底层数据结构详解

    目录   1.字符串 1.1 SDS定义 1.2 SDS1好处 2.列表 2.1 void 实现多态 3 字典 3.1   底层实现是hash表 3.2 字典结构 3.3 哈希算法 3.3.1 rehash 3.3.2 rehash的触发时机 3.3.3 渐进式rehash 扩展或收缩哈希表需要将ht[0]里面的所有键值对rehash到ht[1]里面,但是,这个rehash动作并不是一次性、集中式

    2023年04月09日
    浏览(30)
  • java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层

    对于数据结构我这边只告诉你右边框框里的 栈的特点:后进先出,先进后出,入栈也成为压栈,出栈也成为弹栈 栈就像一个弹夹 队列先进先出后进后出 队列像排队 链表查询满 但是增删快(相对于数组而言) 拓展:还有一个双向链表 他在查询元素的时候更快些,因为他在拿到一个元素

    2024年02月05日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包