mysql数据库索引底层原理---------B+树(内附原理图)

【MySQL进阶】深入理解B+树索引底层原理 阅读详情

mysql索引底层原理

B+树的原理

这里主要介绍的是B+树中,两种存储引擎MyISAM和InnoDB的区别(需要具备一定的数据结构知识)。

1.什么是B+树

在这里插入图片描述
B+树是一种树的数据结构,通常用于数据库和操作系统的文件系统中。B+树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。
1.首先插入第一个元素为4,再插入第二个元素5,因为树形结构的特性,5大于4,所以5是存储在右边的。
2.接着再插入第三个元素3,因为3小于4,所以存储在左边,当插入第四个元素6的时候,会进行向上分裂。下面会提到为什么会分裂。
3.分裂后5的索引信息就被向上分裂。

2.阶数m(分裂原因)

阶数m,阶数代表每个节点能存放多少个key,也就是索引元素,通常是主键,每个节点最多能有m-1个key,当节点的key满了时候,再存放下一个key的时候,节点就会从左往右数第(m/2)向下取整后+1 的那个位置的索引会被向上分裂。
比如:m=5,当一个节点要添加第五个key的时候,本来应该放在第三个位置的key会被向上分裂,但是元数据信息还是存放在叶子结点,只是索引信息被向上分裂而已。
(而上图所示的阶数为4)

3.节点

节点就是一组索引信息,比如上图,3和4为一个节点,5和6为一个节点。

4.叶子结点

叶子结点存放索引信息以及data域。data域就是存放一些和数据相关的信息

5.非叶子节点

非叶子节点只存放索引信息,就是在搜索数据的时候使用。
比如:像上图所示,我要找到3,首先从根节点开始找,就是从5开始找,然后比较,因为3比5小,所以去它的左子节点找,也就是3和4所在的节点,然后再进行比较,就找到了3这个索引信息。

6.MyISAM:

树的叶子节点中的data域存放的是数据记录的地址。
如开头那幅图所示:
在索引搜索的时候,首先按照B+Tree搜索算法找到索引,如果找到了指定的key,则取出其data域的值,然后以data域的值,也就是地址去读取相应的数据记录,如果没有主键,key就是由地址转换过来的。这被称为"非聚簇索引",因此 MyISAM,索引文件和数据文件是分离的。
因为叶子节点中只存储着地址(也就是该值所对应的那条数据所在地址),找到对应的地址,然后去地址中取出数据。所以在这主键索引和辅助索引并没有太多区别,就算没有主键也是一样的。

7.InnoDB:

1.其数据文件本身就是索引文件。它的表数据文件本身就是按B+树组织的一个索引结构,叶子节点的data域保存了完整的数据记录。这个索引的key通常是表的主键。这被称为聚簇索引,也叫主键索引。InnoDB存储引擎会自动选一列作为聚簇索引,也叫主键索引。
关于 InnoDB 选择哪个列作为聚簇索引存储,大概的优先级为:

  1. 如果定义了主键( primary key ),则使用主键作为聚簇索引
  2. 如果没有定义主键,则选择第一个不包含 NULL的唯一键的列做聚簇索引。
  3. 如果都没有,系统则会生成一个6字节的列叫row_id做聚簇索引。(会影响插入效率,下面“不设置主键会怎么样”中会提到)

2.而其余的索引,比如:普通索引都作为辅助索引
辅助索引它的叶子节点只保存了行的主键值和指向对应行的 “书签” , 一般指向的是主键索引,然后再根据主键索引来搜索,直接找到key所在的节点就能取出数据;也就是说在根据辅助索引查找时,则需要先找到索引元素,然后取出主键值,再走一遍主键索引,最后得到数据,这叫做回表操作。
如图:InnoDB的索引类型

3.此外 innoDB 实现了覆盖索引, 就是说在树的叶子节点除了保存该行的键值以外还保存了对应索引列的值,如果不需要额外数据的话则不需要另外对聚簇索引中的数据进行磁盘 IO。
例如说:现在我在user表中为这两个字段创建了普通索引(username,age),在查询数据的时侯: select username, age from user where username='Java’and age=22。就是说所要查询的列数据都是保存在叶子节点中的!所以不需要进行回表操作。
4.还有在设计表的时候,不建议使用非单调递增的字段作为主键,这样会造成主键索引节点的频繁分裂

8.为什么是整型主键?

在聚簇索引中。如果碰到不规则数据插入时,会造成频繁的节点分裂(因为索引要排好序),插入速度比较慢。所以聚簇索引的主键值应尽量是连续增长的值,而不是随机值,否则会造成大量的节点分裂与节点移动。
故对于InnoDB的主键,尽量用整型,而且是递增的整型。这样在存储/查询上都是非常高效的,
所以说索引是需要排好序的,相较于整型类型的比较,字符串类型的大小比较还要进行ASCII码转换。

9.不设置主键会怎么样?

在关于innoDB的段落中提到——如果都没有,系统则会生成一个6字节的列叫row_id做聚簇索引,在所有用ROW_ID列的表,共享同一个被保存在数据字典中的全局序列数,且下一个将要使用的值被保存在系统表空间的page 7。 而且这个全局序列计数器被InnoDB的系统级数据字典锁,保护它的线程安全问题,那么这个是全局锁,所有操作都是串行操作,就非常的影响插入性能。
但是对于MyISAM存储引擎来说就无所谓了(上面关于MyISAM段落中有提到)

10.主键索引

如开头图的第四步所示,那个就是主键索引。索引信息存放的是主键

11.辅助索引

如图所示,辅助索引它的叶子节点只保存了行的主键值和指向对应行的 “书签” , 一般指向的是主键索引

Mysql索引结构全维度比较 前言 在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作索引结构(这里不考虑hash等其他索引)。本文将从最普通的二叉查找树开始,逐步说明各种树解决的问题以及面临的新问题,从而说明MySQL为什么选择B+树作为索引结构。 一、二叉查找树(BST):不平衡 二叉查找树(BST,Binary Search Tree),也叫二叉排序树,在二叉树的基础上需要满足:任意节点的左子树上所有节... 阅读详情

相关推荐

她问我:为什么 MySQL 喜欢 B+ 树?我笑着画了 20 张图

「为什么 MySQL 采用 B+ 树作为索引?」这句话,是不是在面试时经常出现。 要解释这个问题,其实不单单要从数据结构的角度出发,还要考虑磁盘 I/O 操作次数,因为 MySQL 的数据是存储在磁盘中的嘛。 这次,就跟大家一层一层的分析这个问题,图中包含大量的动图来帮助大家理解,相信看完你就拿捏这道题目了! 怎样的索引的数据结构是好的? MySQL 的数据是持久化的,意味着数据(索引+记录)是保存到磁盘上的,因为这样即使设备断电了,数据也不会丢失。 磁盘是一个慢的离谱的存储设备,有多离谱呢?

weixin_64314555的博客 2809

mysql中B+树索引原理

mysql索引与B+树的关系

qqazqaz的博客 4840

步科触摸屏编程

1.首先官网上下载kinco软件,然后再安装驱动,安装的方式是需要两个文件。把两个文件放到driver文件夹下面,然后设备管理器右键更新,手选driver文件夹,自动安装即可。 步科触摸屏驱动文件下载地址 2.按照步科触摸屏使用手册一步一步来建立工程 Kinco HMIware使用手册下载地址 登录界面 涉及到的是页面切换,用的是login window,然后只留下等级输入那个

MAYBE的博客 2万+

Mysql B+树索引算法原理

一、索引算法分类 Hash表 等值查询效率比较高、但是不支持范围查询 二叉树 时间复杂度log2n 缺点:有可能产生不平衡 类似于链表的结构 时间复杂度为o(n) 平衡二叉树avl/红黑树 使用旋转和变色方式保证平衡 它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1 缺点: 如果存放几百条数据的情况下,树高度越高,查询效率会越慢 B-Tree树 叶子节点具有相同的深度、叶子节点指针是为空 ,所有索引的元素不能够重复 叶子节点的数据从左到右递增排列。 B+树 1.非叶子节点不存储data,只存

小毕超博客 4998

Windows Server 2012 R2虚拟机安装全攻略:从镜像选择到网络配置一步到位

本文提供Windows Server 2012 R2虚拟机安装全攻略,涵盖从镜像选择到网络配置的完整流程。详细讲解在Oracle VM VirtualBox中的安装步骤、TCP/IP网络设置、系统优化及常见问题解决方案,帮助用户快速搭建可立即投入使用的服务器环境。特别适合IT初学者和系统管理员学习传统服务器应用的部署与配置。

weixin_28363123的博客 541

Silly Tavern(酒馆)AI 角色扮演下载与安装教程(Windows本地部署)

SillyTavern是一款开源AI角色扮演前端工具,支持沉浸式对话和长期角色互动。本文详细介绍了在Windows系统F盘部署SillyTavern的完整流程,包括下载项目、安装Node.js和Git环境、配置路径、启动服务等关键步骤,并特别说明非系统盘路径可能遇到的npm安装问题及解决方法。成功启动后,用户可通过浏览器访问本地地址使用该工具进行AI角色扮演互动。

Tan3851的博客 1万+

MySQL索引-B+树(讲得通透)

索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。 索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在[1,2,3,4]中找到4这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。索引在mysql数据库中分三类: B+树索引、Hash索引、全..

尽量致力于发表微服务、中间件和算法等原创作品。 1万+

基于Simulink的前馈解耦SVPWM整流器仿真

本文提出了一种基于Simulink的前馈解耦SVPWM整流器仿真方案,针对传统双闭环控制存在的耦合严重、电压利用率低等问题进行优化。通过前馈补偿dq轴耦合项(ωLiq和ωLid)结合SVPWM调制算法,实现了电流跟踪误差<3%、电压利用率达0.99、THD<3%的性能指标。文章详细阐述了系统架构设计,包括前馈解耦原理推导、SVPWM算法实现步骤,并提供了完整的Simulink建模方法。仿真结果表明,该方案在动态响应速度(25ms)和直流电压纹波(1.1%)方面显著优于传统SPWM控制。同时给出了

MHD0815的博客 165

mysql索引的原理和底层结构

索引的底层结构使用的B+树和hash,但是我们一般推荐使用B+树,原因可能很少有人知道。 为什么索引的实现是B+树,而不是散列表,二叉树,B-等 B+B-相对于二叉树: 首先需要明确索引也是需要存储到磁盘的,然后B+-树相对于二叉树,最明显存在两点区别 1 二叉树深度较深,而深度越大,就说明指针的移动越多,需要读取的节点越多,这样就会导致磁盘IO是寻道时间多,IO次数增多耗时 2 B+-...

进化的深山猿 8130

学Simulink——基于Simulink的单相PWM整流器PI电压外环+电流内环控制建模示例

本文详细介绍了基于Simulink的单相PWM整流器双闭环控制仿真方法。通过电压外环PI控制器调节有功功率生成电流指令,电流内环PI控制器实现正弦电流跟踪,最终达到输出电压稳定(400V±2V)、输入电流THD<3%、功率因数>0.99的目标。文章包含系统架构、数学模型、Simulink搭建步骤(主电路、PI控制器、SPWM调制等)及三种典型工况的仿真验证,并给出电感设计、数字实现等工程实践要点。该方案克服了传统整流器高谐波、低功率因数的问题,为绿色电源开发提供了可验证的仿真模型。

xiaoheshang_123的博客 75

6、线性时序逻辑到确定性自动机的翻译

本博文详细介绍了将线性时序逻辑(LTL)转化为确定性自动机的理论基础、技术方法和实际应用。内容涵盖LTL的基本运算符、确定性自动机的特点及其在模型检测中的作用,以及具体的翻译步骤与优化策略。通过实际案例展示了如何利用这一技术进行系统属性验证,并探讨了翻译过程中可能遇到的挑战及解决方案。

gpu4optimizer的博客 152

索引底层原理

主要基于 innodb 存储引擎了解。

qq_40119717的博客 587

RK3588开发笔记-mipi csi接口imx415摄像头调试记录

摘要:本文详细介绍了RK3588开发板适配SONY IMX415 MIPI CSI摄像头的调试过程。从硬件环境准备(包括RK3588核心板、IMX415模块连接及测试工具)、软件环境配置(Linux 5.10内核、驱动状态确认),到设备树关键配置(MIPI链路、GPIO引脚、电源域等)都进行了详细说明。调试过程中通过dmesg日志、media-ctl拓扑分析等工具验证了摄像头驱动加载和图像采集功能。最终实现了800万像素高清图像采集,总结了硬件连接验证、信号完整性优化等关键经验,为类似MIPI摄像头调试提供

flypig has a dream! 886

数据库索引实现原理

MySQL索引实现 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。 MyISAM索引实现 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图: 图8 这里设表一共有三列,假设我们以Col1为主键,则图8是一个MyISA...

pocher的博客 1万+

vLLM显存逆向计算:如何得到最优gpu-memory-utilization参数

本文提出了一种**逆向工程**的思路:基于vLLM显存占用的底层机制,通过精确计算模型权重、KV缓存、激活内存等各组件的显存需求,**倒推出最优的gpu-memory-utilization参数**。这种方法让我们能够在部署前就准确预估资源需求,实现一次配置、稳定运行。本文我们将从vLLM显存计算的核心原理出发,构建完整的倒推计算框架和源码,并通过大量实验验证其准确性(会有误差,但基本可以直接使用)。

羊城迷鹿的博客 1952

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据库索引原理及其分类详解

索引是帮助MySQL高效获取数据的数据结构(有序索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。B树存储结构示意图:B+树存储结构示意图:B-tree因为B树不管叶子节点还是非叶子节点,都会保存数据在单个节点存储容量有限的情况下,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度。

weixin_43287459的博客 1506

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MySQL索引的底层实现原理

数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘块(对应索引树的节点),索引树越低,越“矮胖”,磁盘IO次数就少MySQL支持两种索引,一种的B-树索引,一种是哈希索引,大家知道,B-树和哈希表在数据查询时的效率是非常高的。这里我们主要讨论一下MySQL InnoDB存储引擎,基于B-树(但实际上MySQL采用的是B+树结构)的索引结构。

qq_41897304的博客 950

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

MySql数据库索引底层数据结构

索引是帮助数据库高效获取数据的排好序的数据结构。一般的说法索引相当于目录其实并不太准确。 索引是存在硬盘文件里的 数据是如何存储与读取的? 索引采用了什么数据结构呢?        常见的数据结构有:二叉树、红黑树、hash、B树、B+树。        首先来看如果采用Hash,它是把数据进行Hash直接对应磁盘存储...

学习 2367

mysql:深度解析MySQL选择B+树作为索引结构的本质原因

业务场景优化手段预期收益指标超高并发点查缩短键长度+增大填充因子QPS提升30%~50%海量数据范围查询冷热分离+压缩叶子节点查询延迟降低60%+混合读写负载使用FPGA加速B+树遍历吞吐量提升3倍SSD环境调整innodb_io_capacity参数IOPS利用率提高40%阿里内部数据:在双11大促中,经过B+树优化的订单库可支撑峰值58万次/秒的查询请求,平均延迟<5ms。-- 检查页利用率。

weixin_43290370的博客 947

mysql数据库相关流程图/原理图

mysql数据库相关流程图/原理图1、mysql数据库相关流程图/原理图1.1 mysql主从复制原理图1.2 Mysql逻辑架构图1.3 InnoDb 逻辑存储结构图1.3.1 表空间(tablespace)1.3.2 段(segment)1.3.3 区(extent)1.3.4 页(page)1.4 Innodb页结构相关示意图1.4.1 Innodb页结构单体图1.4.2 记录在页中的存储流...

爱是与世界平行 3802

mysql索引底层图_MySQL索引底层实现原理

O(log2n)的复杂度内获取到相应数据。虽然这是一个货真价实的索引,但是实际的数据库系统几乎没有使用二叉查找树或其进化品种红黑树(red-black tree)实现的,原因会在下文介绍。二叉排序树在介绍B树之前,先来看另一棵神奇的树——二叉排序树(Binary Sort Tree),首先它是一棵树,“二叉”这个描述已经很明显了,就是树上的一根树枝开两个叉,于是递归下来就是二叉树了(下图所示),而...

weixin_28783937的博客 163

b 树原理 mysql_B-/B+树看 MySQL索引结构

B-树B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树。它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图:B-树B-树有如下特点:所有键值分布在整颗树中;任何一个关键字出现且只出现在一个结点中;搜索有可能在非叶子结点结束;在关键字全集内做一次查找,性能逼近二分查找;B+ 树B+树是B-树的变体,也是一种多路搜索树,...

weixin_36354817的博客 90

索引的底层实现原理和优化?思维导图 代码示例(java 架构)

索引是数据库管理系统(DBMS)中用于加速数据检索的重要工具。理解索引的底层实现原理有助于更好地优化查询性能。以下是关于 MySQL 中索引的底层实现原理及其优化策略的详细介绍。

qq_33240556的博客 1079

Mysql聚簇索引和非聚簇索引原理(数据库)

一、‘页’和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他的功能,需要访问磁盘加载数据到内存然后等待进入cpu运算,因为数据量大小远远大于内存大小。因此提出虚拟内存概念。虚拟内存就是将程序用到的数据进行划分,暂时用不到的放到磁盘里,用到的放到内存里,操作系统中总是运行着不止一个进程,各个进程有优先级顺序,所以存在进程调度问题,进程的每次调度都会导致内存和磁盘数据置换,段式内存

lisuyibmd的专栏 4万+

图解B-/B+树看MySQL索引结构

专注于Java领域优质技术号,欢迎关注作者:似水牛年B-树B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树。 它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图:B-树B-树有如下特点:所有键值分布在整颗树中;任何一个关键字出现且只出现在一个结点中;搜索有可能在非叶子结点结束;在关键字全集内做一次查找,性能逼近二分查...

weixin_34061042的博客 381

oracle是b树 MySQL是B 树_oracleB树索引和位图索引使用探讨

前言众所周知建立索引是为了提高数据库查询效率。正解的索引确实能够数倍的提高数据库查询效率,但一个错误的索引将会把数据库拖慢,甚至拖死。本文意在探讨如何选择索引类型。正文Oracle常用的有两种索引类型:B树索引和位图索引。一、B树索引B树索引:B树索引是最常用的索引,它的存储结构类似于书的目录索引结构,有分支节点和叶子节点,分支节点相当于书的大目录,叶子节点相当于具体到页的索引。B树索引是orac...

weixin_39877504的博客 409
下一篇: SpringBoot自动装配原理--------@SpringBootApplication注解
AY_G
博客等级 码龄7年 330粉丝 5原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值