MySQL底层数据结构

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

1、引入

一个sql语句在mysql中究竟是如何运行的?又应该通过怎样的方式去查找我们要找的数据?这里就涉及到几种存储数据的算法;

可以做索引的数据结构有数组、链表、二叉搜索树和B树(B-树、B+树)。

2、各种数据结构

2.1、HASH

由于HASH查询和写入的时间复杂度是O(1),这意味着只需要一次hash计算就可以得出数据位置,但是会存在hash冲突,并且MySQL没有使用HASH表作为底层数据结构,是因为HASH不支持范围查找。

2.2、二叉搜索树

二叉搜索树的中序遍历结果是一个有序数组

1 2 3 4 5 6 7 8

二叉搜索树最好的时间复杂度是O(logN),最坏为O(N)

MySQL底层数据结构

只写了10~11个元素,这棵树的树高就已经4层了,意味着每树高一层MySQL在查询数据的时候就多一次IO。

IO特性是系统中最重要的瓶颈,二叉搜索树在数据量非常大的时候是没有办法控制树的高度,所以也不是MySQL选用的数据结构。

2.3、N叉搜索树

N叉搜索树是对二叉搜索树做了一个优化

MySQL底层数据结构 

*这棵树依然满足范围查找的要求

*有效的降低了树高

但MySQL依然觉得这棵树不太理想,于是在这个N叉搜索树上做了一些优化

2.4、B+树

MySQL底层数据结构 

MySQL底层数据结构 

通过观察可以发现B树和B+树的一些区别,下面是对结果的总结

1、叶子页点之间都有一个相互连接的引用,可以通过一个叶子节点找到他相邻兄弟节点在MySQL中叶子节点之间是一个双向循环链表

2、非叶子节点的值,都包含在叶子节点中,在MySQL中非叶子节点保存了子节点的引用,没有存真实的数据,真实的数据全都放在了叶子节点。

3、对于B+树来说,在相同树高的情况下,查找任意元素的复杂度都是一样的,中间比较次数也都差不多,也就是说性能均衡,只要控制树高,就能达到性能可控的效果。

4、非叶子节点中的值,都是其他叶子节点中的第一个元素

3、MySQL读取数据

 MySQL读取数据时,把数据放到一个叫数据页的这个单元中,每一个页大小是16kb,每一页对应的就是B+树中的一个节点。

如果我们一条数据只有1kb,那么一个叶子节点就可以放16条数据。如果我们用主键索引,非叶子节点保存的是它孩子节点的引用(6B),同时保存主键的值(8B),一个数据单元就只占用14B。

一个页(节点)的大小为16kb,一个对子节点的引用大小为14B,那么一页里就可以存1170个对字节点的引用。

最终三层树高的B+树就可以存放的数据是1170*1170*16=21,902,400条数据。

也就是说在符合上述的条件下,21,902,400条数据中可以控制在三层树高,那么MySQL就可以通过三次IO操作就把数据信息找出来。

MySQL底层数据结构文章来源地址https://www.toymoban.com/news/detail-477145.html

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

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

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

相关文章

  • 【数据结构】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)
  • 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)
  • Redis - 数据类型映射底层结构

    从数据类型上体现就是,同一个数据类型,在不同的情况下会使用不同的编码类型,底层所使用的的数据结构也不相同。 字符串对象的编码可以是 int 、 raw 和 embstr 三者之一。 embstr 编码是专门用于保存简短字符串的一种优化编码方式,与 raw 编码会调用两次内存分配函数分

    2023年04月21日
    浏览(23)
  • 关于对索引底层数据结构的理解

    目录 我们在谈论索引底层的数据结构之前,我们不妨先想一下索引是什么以及索引存在的作用 Hash 二叉搜索树与二叉平衡树 多叉平衡查找树(B树) B+树 索引:是一种特殊的文件,包含着对数据库表中所有记录的引用指针,而其的作用也体现的很明确了,我们通过创建索引来

    2024年02月09日
    浏览(30)
  • InnoDB底层的一些主要数据结构

    MySQL的InnoDB存储引擎使用了一些关键的底层数据结构来优化数据的存储、索引和查询。以下是InnoDB底层的一些主要数据结构: 1. **B+树索引**:    - InnoDB的主要数据结构是B+树(平衡树的一种变体),用于存储表数据和索引。    - 每个InnoDB表都有一个主键索引(如果没有显式

    2024年02月01日
    浏览(31)
  • JAVASE->数据结构|顺序表底层逻辑

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 目标: 1. 什么是 List 2. List 常见接口介绍 3. List 的使用 本章主要学习顺序表底层逻辑,大致是一样的,不差多少。 在集合框架中, List 是一个接口,继承自 Co

    2024年04月29日
    浏览(24)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包