MySQL 索引结构浅析

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

索引结构

InnoDB B 树

上面是二叉树和红黑树的结构,其实红黑树是一个自平衡二叉查找树,可以用于解决二叉树顺序插入时形成一个有序链表问题。

但是两者都有一个明显缺点,就是当数据量过大时,层级较深,检索速度慢。

下面分析一下 B树(多路平衡查找树)

名词解析:

  • 度数:指的是一个节点的子节点个数。

上面这个 B 树图,度数为 5 也成为 5 阶,最多可以存储 4 个 key,5 个指针。

例如:小于 20 的会走第一个指针找到 【10,15,18】这个子节点,在 20 - 30 之间的会找到 【23,25,28】这个子节点依此推断,如果一个节点 N 个 key,那么就有 N+1 个指针。

这样的数据结构优势非常明显,每一层能存储的数据量增加了,并且有效的降低了树的层级数。

上图是一个 B 数的插入分裂演变过程。

假设这个 B 数的最大度数是 5 阶,那么最多能存储 4 key,5 个指针。

其核心在于插入顺序和分裂过程:简单来说就是按顺序插入,当插入时发现这个节点以及满足 4 个 key 了,那么此时就需要进入到向上分裂过程,这个分裂是从当前节点的中间 key 向上分裂过程。

eg:待插入元素 【2456】,当前节点元素【1800,1888,1980,2000】

  1. 插入前发现当前节点存储的 key 已经到达最大值,此时当前节点需要向上分裂。
  2. 插入后节点元素为【1800,1888,1980,2000,2456】,此时挑选中间元素向上分裂成为当前节点的父节点。
  3. 分裂结果:【1980】(父节点元素)、【1800,1888】|【2000,2456】
  4. 最终效果是:小于【1980】的指针指向【1800,1888】,大于【1980】的指针指向【2000,2456】

InnoDB B+ 数

首先看看经典的 B+ 树结构:

上面这个是经典 B+ 树,其插入顺序和分裂过程跟 B 树类似,主要的区别点有 3 个:

  1. 分裂过程:在分裂过程中不单单是只将中间元素向上分裂,同时会将向上分裂的那个元素留在分裂后的子结点中。
  2. 所有的数据都在叶子节点。
  3. 叶子节点形成一个单线链表。

这分裂过程的特点主要结合所有数据都在叶子节点这个特点去理解。

因为可能我待插入数据他会导致节点出现向上分裂的过程,但是因为 B+ 树所有数据都在叶子节点,所以需要将待插入的数据保存在叶子节点中

在 InnoDB 中的 B+ 树结构。

从上图中可以看到 MySQL 针对经典 B+ 树进行了优化(要根据物理存储结构以及保证查询效率)。

首先看看针对数据结构有什么优化:

  1. 叶子节点之间变成了环形双向链表(提高区间访问效率)
  2. 每个节点都存在中(由 MySQL 中数据在磁盘I/O的基本单位)。

MySQL 表空间和数据区的概念:

  • 表空间:从 InnoDB 逻辑存储结构来看,所有的数据都被逻辑的存放在一个空间中,这个空间就叫做表空间(tablespace)。表空间由 段(segment)、区(extent)、页(page)组成。创建一个表,磁盘中就有对应的 .ibd 文件。

    在表空间里有很多组数据区,一组数据区(256MB)是256个数据区, 每个数据区(1MB)包含了64个数据页,每个页(16KB

  • 段(segment):分为索引段,数据段,回滚段等。其中索引段就是非叶子结点部分,而数据段就是叶子结点部分,回滚段用于数据的回滚和多版本控制。一个段包含256个区(256M大小)。

  • 区(extent):区是页的集合,一个区包含64个连续的页,默认大小为 1MB (64*16K)。

  • 页(page):页是 InnoDB 管理的最小单位,常见的有 FSP_HDR,INODE, INDEX 等类型。所有页的结构都是一样的,分为文件头(前38字节),页数据和文件尾(后8字节)。页数据根据页的类型不同而不一样。

小结:

本次简单的对 B 树,B+ 树,InnoDB B+ 树,进行了简单的一个分析。

为了更好的去理解 InnoDB B+ 树,后续可能还需要去详细理解 B+ 树的具体实现、自平衡的原理(左旋右旋)。

后面准备详细学习一下 MySQL 的调优,从建表规范、查询语句优化、索引优化、分库分表 各个方面进行学习。文章来源地址https://www.toymoban.com/news/detail-632491.html

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

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

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

相关文章

  • 【MySQL高级】——InnoDB索引&MyISAM索引

      MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。 这些数据结构以某种方式指向数据, 这样就可以在这些数据结构的基础上实现 高级查找

    2023年04月27日
    浏览(52)
  • Mysql-InnoDB索引:普通索引、主键索引、唯一索引、组合索引

    事务方面 InnoDB支持事务,MyISAM不支持事务。这是Mysql将默认存储引擎从MyISAM变成InnoDB的重要原因之一 外键方面 InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MyISAM会失败 索引层面 InnoDB是聚集(聚簇)索引,MyISAM是非聚集(非聚簇)索引。 MyISAM 支持 FULLTEXT 类型

    2024年02月03日
    浏览(52)
  • MySQL InnoDB什么时候更新索引的统计信息?

    MySQL InnoDB的索引统计信息在什么时候更新呢? 或者说什么事件会触发InnoDB索引的统计信息更新呢?下面结合参考资料 When Does InnoDB Update the Index Statistics? (Doc ID 1463718.1) [1] 简单总结梳理一下(文中大部分知识点来自参考资料)。 ANALYZE TABLE命令会 显式强制 更新表的索引统计信

    2024年02月08日
    浏览(34)
  • 浅析MySQL代价模型:告别盲目使用EXPLAIN,提前预知索引优化策略

    在 MySQL 中,当我们为表创建了一个或多个索引后,通常需要在索引定义完成后,根据具体的数据情况执行 EXPLAIN 命令,才能观察到数据库实际使用哪个索引、是否使用索引。这使得我们在添加新索引之前,无法提前预知数据库是否能使用期望的索引。更为糟糕的是,有时甚至

    2024年02月05日
    浏览(48)
  • 【MySQL】InnoDB数据存储结构

    第一部分:文件头部+文件尾部 主要包含了对页面之间双向链表的表示、页面校验和、页面最后被修改对应的日志序列位置 第二部分:空闲空间+用户记录+最小最大记录 用户记录 : ​ 用户记录中的记录按照指定的行格式一条条摆在该区域,相互之间形成单链表。 第三部分:

    2024年01月24日
    浏览(43)
  • MySQL-07.InnoDB数据存储结构

    索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的 存储引擎 负责对表中数据的读取和写入工作。不同存储引擎中 存放的格式 一般是不同的,甚至有的

    2024年04月27日
    浏览(41)
  • Mysql第二篇---InnoDB数据存储结构

    索引结构给我们提供了高效的索引方式, 不过索引信息以及数据记录都是保存在文件上的(innodb的ibd文件, MyISAM的MyI和MyD文件), 确切的说是存储在页结构中. 另一方面, 索引是在 存储引擎 中实现的, MySQL服务器上的存储引擎负责对表中数据的读取和写入工作. 不同存储引擎中存放

    2024年02月07日
    浏览(63)
  • MySQL 存储引擎 InnoDB 内存结构之缓冲池

    缓冲池是主存储器中的一个区域,在访问 table 和索引数据时 InnoDB 会对其进行缓存。缓冲池允许直接从内存中访问频繁使用的数据,从而加快处理速度。在专用服务器上,通常将高达 80% 的物理内存分配给缓冲池。 为了高效处理大量读取操作,缓冲池被划分为可以容纳多行

    2024年02月10日
    浏览(38)
  • MySQL的varchar存储原理:InnoDB记录存储结构

    摘要: varchar(M) 能存多少个字符,为什么提示最大16383?innodb怎么知道varchar真正有多长?记录为NULL,innodb如何处理?某个列数据占用的字节数非常多怎么办?影响每行实际可用空间的因素有哪些?本篇围绕innodb默认行格式dynamic来说说原理。 本文分享自华为云社区《MySQL的v

    2024年02月04日
    浏览(41)
  • MySQL 存储引擎 InnoDB 内存结构之更改缓冲区

    更改缓冲区(Change Buffer)是一种特殊的数据结构,用于缓存不在缓冲池中的二级索引(secondary index)页的更改。可能来自于 INSERT 、 UPDATE 或 DELETE 操作(数据操作语言,DML)的缓冲更改,会在后续通过其他读操作将这些页加载到缓冲池时被合并。 与聚簇索引(clustered indexe

    2024年02月10日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包