Mysql索引的实现原理,B+Tree,WAL

news2024/11/19 0:37:53

InnoDB 引擎,每一个数据表有两个文件 .frm.ibd,分别为表结构,数据和索引,数据挂在主索引的叶子节点上,此主索引称为聚簇索引。

MyISAM 引擎,每一个数据表有三个文件.frm.MYI.MYD,分别为表结构,索引,数据;也就是说其索引和数据是分开的,索引的叶子节点存储的不是数据而是磁盘地址,称为非聚簇索引。

下面只分析 InnoDB 引擎。

一、为什么是 B+Tree 而不是 B-Tree

B-Tree

img

B+Tree

img

他两最大的区别就是 B+Tree 将data部分下沉到了最后一级,即叶子节点。

对于基于磁盘的存储,一般使用对磁盘的IO次数来评判索引结构的优劣,假设操作系统对磁盘的每次IO能读取 4K 数据(块),假设索引结构的每一个节点有16K的固定空间,这个16K称为页,索引以页作为最基本的管理单位,所以每一次读取要4次IO,从节省IO次数的角度讲,如果每个节点上如果能存储更多的key就能减少IO的次数,而B+Tree是将所有的data下放到叶子节点,其他节点全部用来存储key和指针,显然IO效率更高。

一般在数据库系统或文件系统中使用的B+Tree结构都在经典B+Tree的基础上进行了优化,增加了顺序访问指针。在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,做这个优化的目的是为了提高区间访问的性能。也就是说,通过这个指针你可以访问到已经排序好的key的列表。

二、InnoDB 引擎读写磁盘的过程

我们经常听人说Mysql对磁盘的写操作是随机寻址的,所以需要WAL组件。但是为什么Mysql对磁盘的写操作是随机寻址的呢?这就需要了解它读写磁盘的过程。

就以InnoDB引擎为例,其索引结构和源数据都存在.ibd文件里,文件是一块大的连续的磁盘空间,收到查询请求后引擎就去读取此文件的主索引,以页(16K)为单位读取,从B+Tree的根节点开始,当然有时候一个节点不止一页,如果没有找到这个key就要接着读,直到找到了data。

从根节点指向一级节点的时候,那么一级节点存在文件中的哪个位置呢,或者说即便你知道了它在文件中的位置,你要怎么读到它呢,我们可以使用相对于文件起始位置的偏移量来读取那一块的数据,或者计算出其在磁盘上的地址,然后直接读取磁盘,所以指向子节点使用的是指针,整个的读取过程是跳跃的随机的。

同样的,在写入的时候,要写入的目标磁盘块的位置也是跳跃的,所以说写操作是随机的寻址,它不是append模式。有时候在写入后现有节点还要调整。

说到底这些节点都还是存在于文件中,文件是一块大的连续的磁盘空间,所以这里的指针应该是相对于文件起始地址的相对地址,而不能是磁盘的绝对地址,否则你一移动文件那岂不都失效了。

在机械硬盘上面,这种随机寻址会严重影响磁盘的IO性能。

三、需要 WAL (Write-Ahead Logging)

既然直接落盘性能堪忧,那就改成异步落盘。基本上所有的数据库都使用WAL模式来解决这个问题,实现方式可能各有不同,但大致思路都是一样的。

一个修写入请求,先写入日志文件,成功之后才写入缓存,然后有后台程序将日志文件的内容落盘。

在写日志文件的时候,使用 append模式,这就是顺序写,要比随机写好很多。

redo log:保证数据一致性。如果Mysql宕机了,重启的时候可以将日志文件中未落盘的数据落盘。

undo log:保证事务的原子性,实现多版本并发控制(MVCC)。它相当于在修改之前做一下备份。

组提交机制:将多个小的事务合并成一组再执行落盘,可以大幅度降低磁盘的 IOPS 消耗。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1867463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker-compose 实现Prometheus+Grafana监控MySQL及Linux主机

. ├── Grafana │ ├── data │ └── docker-compose.yaml ├── Mysql │ ├── conf │ ├── data │ ├── docker-compose.yaml │ └── logs ├── Mysqld_exporter │ ├── conf │ └── docker-compose.yaml ├── node-exporter │…

使用新H5标签dialog,实现点击按钮显示分享链接弹出层交互功能

使用新H5标签&#xff0c;实现点击按钮显示分享链接弹出层交互功能 在现代网页开发中&#xff0c;使用新技术和标签来提升用户体验是非常重要的。今天&#xff0c;我们就来聊聊如何利用HTML5的<dialog>标签来实现一个简洁实用的分享链接功能。 在过去&#xff0c;我们通常…

golang——Gin框架及路由介绍

一. 框架介绍 Gin是一个轻量级的Go语言Web框架&#xff0c;它具有高性能和简洁的设计。由于其快速的路由匹配和处理性能&#xff0c;Gin成为Go语言中最受欢迎的Web框架之一。 特点&#xff1a; 快速和轻量&#xff1a;Gin框架的设计注重性能和效率&#xff0c;采用了一些优化措…

暗黑4PTR怎么参与测试 暗黑4第五赛季怎么参加PTR测试教程

暗黑破坏神4作为暗黑破坏神系列的最新作品&#xff0c;自从2023年上线就受到了一众好评。游戏是动作冒险类角色扮演游戏&#xff0c;游戏的背景设定在一个腐化的圣休瑞亚大陆上&#xff0c;玩家们可以五种职业中选择自己喜爱的游戏进行游戏。 暗黑破坏神4第五赛季现在已经开启P…

时序约束(一):时钟的约束

目录 一、时钟约束的目的 二、约束工程项目 三、主时钟和生成时钟 四、主时钟约束 五、生成钟约束 一、时钟约束的目的 之前的文章对时序分析的基本原理做了介绍&#xff0c;我们会发现时序分析离不开时钟信号。对于时序分析工具来说同样如此&#xff0c;分析工具需要我…

谈谈你对AQS的理解

AQS概述 AQS&#xff0c;全称为AbstractQueuedSynchronizer&#xff0c;是Java并发包&#xff08;java.util.concurrent&#xff09;中一个核心的框架&#xff0c;主要用于构建阻塞式锁和相关的同步器&#xff0c;也是构建锁或者其他同步组件的基础框架。AQS提供了一种基于FIF…

《mysql》--mysql约束

数据库约束 有的时候数据库中的数据是有一定要求的&#xff0c;有些数据认为是合法数据&#xff0c;有些是非法数据&#xff0c;如果靠人工检查显然是不靠谱的&#xff1b; 数据库会自动的对数据的合法性进行校验检查目的就是&#xff0c;保证数据中能够避免被插入/修改一些非…

刷盘,还是不刷盘,是一个问题 | 架构师之路重启

前几个有个朋友留言&#xff0c;问我说最近两年公号发读书感悟&#xff0c;职场感悟&#xff0c;AI实践居多了&#xff0c;发架构思路类的内容少了。 最近准备重启架构思路类的内容&#xff0c;且会保持一如既往的风格&#xff1a; 1. 希望引发大家思考&#xff0c;多讨论&…

docker安装与入门使用(适用于小白)

总结&#xff1a;Docker 是一个开源的容器化平台&#xff0c;旨在使开发、部署和运行应用程序的过程更加简单和高效。Docker 使用操作系统级虚拟化在单个主机上运行多个独立的容器。每个容器包含应用程序及其所有依赖项&#xff0c;确保在不同环境中具有一致的运行表现。 下面…

贪心算法——加工木棍(C++)

上大学&#xff0c;一天是一天&#xff0c;两天也是一天。 ——2024年6月27日 之前考试周断更了&#xff0c;今天重新开始&#xff01; 题目描述 有n根木棍&#xff0c;已知每根木棍的长度和重量。这些木棍在木工机器上加工&#xff0c;机器准备加工木棍需要一些时间&#xf…

ABB机器人示教器死机时如何重置?

ABB机器人示教器死机时如何重置&#xff1f; 若遇到机器人示教器死机或卡顿现象时&#xff0c;可尝试将示教器重置&#xff0c;具体方法可参考以下内容&#xff1a; 如下图所示&#xff0c;首先将机器人控制柜断电关机&#xff0c; 如下图所示&#xff0c;同时按住快捷键&…

2024年水利工程与交通运输国际学术会议(ICWCET 2024)

全称&#xff1a;2024年水利工程与交通运输国际学术会议(ICWCET 2024) 会议网址: http://www.icwcet.com 会议时间: 2024/6/25 截稿时间&#xff1a;2024/6/15 会议地点: 天津 投稿邮箱&#xff1a;icwcetsub-conf.com 投稿标题&#xff1a;ICWCET 2024ArticleTEL。 ★会议简介…

目标检测系列(二)yolov1的全面讲解

目录 1、网络结构 2、检测原理 3、制作训练正样本方法 4、损失函数 5、前向推理 6、模型缺限 YOLO的全称是you only look once&#xff0c;指只需要浏览一次就可以识别出图中的物体的类别和位置。YOLO被称为Region-free方法&#xff0c;相比于Region-based方法&#xff0…

GNU、Unix、Linux、Makefile、GCC、GDB、GPL、CentOS 7、Ubuntu之间的关系

全文总结 早期&#xff0c;Unix系统作为一类强大的操作系统&#xff0c;在计算领域奠定了基础。然而&#xff0c;出于对软件自由的追求&#xff0c;Richard Stallman在1983年发起了GNU项目&#xff0c;旨在创建一个完全自由的、与Unix兼容的操作系统。GNU项目不仅倡议软件自由…

Web自动化元素定位之xpath定位【超详细】

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Web自动化常见的定位方式 为什么要学习定位 1.让程序操作指定元素&#xff0c;就必须先找到此元…

金升阳电源被制裁,广州顶源电源模块可以完美替换

广州顶源电子科技股份有限公司,座落于国家高新技术开发区---广州科学城&#xff0c;是一家集研发、生产、销售及服务于一体的DC-DC&#xff0c;AC-DC电源的生产厂家。 公司通过了IATF16949汽车认证及ISO9001:2015质量管理体系认证。拥有专家级研发团队&#xff0c;产品研发经过…

农村经济与科技杂志社农村经济与科技编辑部2024年第8期目录

视点 数字经济驱动农业产业链升级路径研究——以河南省为例 王媛媛; 1-4 城乡融合视角下农村集体产权制度改革研究 齐建丽; 4-7 农业生态系统结构美建设内涵及实现路径 张鹏程; 8-13《农村经济与科技》投稿&#xff1a;cnqikantg126.com 农户宅基地退出政策加权…

2024 最新推广服务 API 推荐,助力业务腾飞

在数字化营销的浪潮中&#xff0c;API 服务正以其强大的功能和高效的特性&#xff0c;成为企业和开发者们实现精准推广、优化营销效果的得力助手。2024 年的今天&#xff0c;各种创新的 API 服务层出不穷&#xff0c;为广告投放、数据洞察等领域带来了前所未有的机遇。在接下来…

华为开发者调试工具使用介绍(MDC)

MDC的开发过程的三大工具&#xff1a;MMC、MDS、Mind Studio&#xff0c;这三个工具完成了开发过程中的配置文件编写、代码编写以及AI模型的开发三个任务。除了开发&#xff0c;MDC还准备了两个调试工具&#xff0c;用于使用过程中数据的查看等。这一些调试工具分别对映射MDC中…

简化部署流程——无线UWB如何实现自标定?

一.什么是UWB信标自标定&#xff1f; UWB&#xff08;超宽带&#xff09;自标定是指在UWB系统中&#xff0c;基站或节点能够自动识别和确定自己的位置&#xff0c;无需外部干预或手动输入其地理位置信息。这种技术主要利用系统内部的信号测量和算法来自动计算节点之间的距离以…