MySQL InnoDB存储引擎中的索引结构解析

目录

  • 常见的几种数据结构
    • 1、二叉树
    • 2、红黑树
    • 3、B树
    • 4、B+树
    • 5、总结
  • 索引结构
    • 1、聚簇索引和非聚簇索引
    • 2、Hash索引
    • 3、总结

常见的几种数据结构

1、二叉树

特点:

  • 每个节点最多有两个子节点,分别称为左子节点和右子节点。
  • 通常不是自平衡的,可能会出现极端倾斜的情况,导致插入和删除的时间复杂度变为 O(n)。

在这里插入图片描述

2、红黑树

红黑树又称平衡二叉树

特点:

  • 每个节点要么是红色,要么是黑色。
  • 根节点是黑色的。
  • 没有连续的红色节点(即红色节点的父节点和子节点不能同时为红色)。
  • 对于每个节点,从该节点到其子孙节点的所有路径上包含相同数目的黑色节点。
  • 新插入的节点为红色,然后通过颜色调整和旋转来满足上述性质。

通过保持特定的平衡条件,可以在插入和删除节点时自我调整,保持树的平衡性,确保操作的时间复杂度为 O(log n)。

红黑树常被用作 C++ STL 中的 map 和 set 的底层实现,以及一些数据库(如 Redis)的内部实现。

总结:红黑树通过旋转调整 解决了二叉树不平衡问题
在这里插入图片描述

3、B树

特点:

  • B树是一种平衡的多路搜索树,每个节点可以有多个子节点,且子节点的数量范围通常称为B树的阶。
  • 每个节点包含有序的键值对,节点内的关键字按升序排列。

总结:B树通过将多个键值存储在每个节点中,以及允许每个节点可以拥有更多的子节点,减少了树的高度。解决了红黑树高度、旋转的问题
在这里插入图片描述
在这里插入图片描述

4、B+树

特点:

  • 非叶子节点只存储key值不存储数据
  • 所有的key值都可以在叶子节点上找到,且是有序的双向链表

总结:B+树通过非叶子节点只存储key值,且叶子节点是有序的双向链表,解决了B树高度、范围查找问题
在这里插入图片描述

5、总结

因此选择B+树是因为非叶子节点只存储索引,不存储数据,可以使每个节点存储更多索引,减小树的深度。叶子节点包含了所有索引的双向链表,方便了范围查询。

索引结构

1、聚簇索引和非聚簇索引

聚簇索引:

  • mysql 中 innodb 存储引擎中的聚簇索引非叶子结点存储的是索引key(通常是主键),叶子节点存储的是行数据

在这里插入图片描述

非聚簇索引:

  • mysql 中 innodb 存储引擎中的非聚簇索引非叶子结点存储的是索引,叶子节点存储的聚簇索引key

在这里插入图片描述
总结:
InnoDB 存储引擎中

  1. 如果表中有主键,则会使用主键来作为聚簇索引
  2. 如果表中没有主键,则会使用第一个唯一索引作为聚簇索引
  3. 如果主键和唯一索引都没有,会选择一个列或一组列作为聚簇索引

拓展:
MYISAM 存储引擎使用的是非聚簇索引,所有叶子节点存储的都是行数据地址的指针,因此在MYISAM中索引和数据是分开存储的。

2、Hash索引

mysql中除了B+树索引其实还有Hash索引,但是应用场景一般不多。默认使用B+树索引

特点:

  • Hash索引使用哈希表实现,适合等值查询,因为它能提供接近O(1)的查找效率。但是,Hash索引并不支持范围查询,因为哈希表无法保持数据的顺序关系。
  • 此外,哈希冲突的存在会导致性能下降,特别是在数据量大的情况下。而B+树索引即使面对大量数据,也能保持较好的性能。

在这里插入图片描述

3、总结

综上所述,InnoDB存储引擎之所以选择B+树作为索引结构,是因为它在保证查询效率的同时,还支持范围查询,并且具有更好的顺序读取性能。当然,这并不意味着B+树在所有场景下都是最佳选择,对于某些特定的使用案例,比如频繁的等值查询,且具有较少的hash冲突,Hash索引可能是一个更好的选择。

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

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

相关文章

Mac中nvm切换node版本失败

Mac中使用 nvm 管理 node 版本,在使用指令:nvm use XXX 切换版本之后。 关闭终端,再次打开,输入 node -v 还是得到之前的 node 版本。 原因: 在这里这个 default 中有个 node 的版本号,使用 nvm use 时&a…

spring boot 实现直播聊天室(二)

spring boot 实现直播聊天室(二) 技术方案: spring bootnettyrabbitmq 目录结构 引入依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.96.Final</version> </dependency>Si…

安装DevEco Studio

下载 首先进入鸿蒙开发者官网&#xff0c;顶部导航栏选择开发->DevEco Studio 根据操作系统下载不同版本&#xff0c;其中Mac(X86)为英特尔芯片&#xff0c;Mac(ARM)为M芯片。 安装 下载完毕后&#xff0c;开始安装。 点击Agree 首次使用&#xff0c;请选择Do not impor…

Vue 详细教程

Vue实战 1. Vue 引言 渐进式 JavaScript 框架 --摘自官网 官网地址&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js # 渐进式 1. 易用 html css javascript 2. 高效 开发前端页面 非常高效 3. 灵活 开发灵活 多样性 # 总结 Vue 是一个javascript 框架 js 简化页面js操作…

Pr自动从视频脚本剪辑视频FirstCut插件免费下载

FirstCut 插件将自动从视频脚本中剪辑视频&#xff0c;在例如新闻、采访、自媒体视频等带有配音或字幕内容的视频制作中提高了粗剪效率。 使用 FirstCut&#xff0c;大大缩短了粗剪的时间&#xff0c;而不是转到每个视频文件并找到 IN 点和 OUT 点&#xff0c;然后将其插入到序…

jmeter,读取CSV文件数据的循环控制

1、构造csv数据 保存文件时需要注意文件的编码格式 id,name,limit,status,address,start_time 100,小米100,1000,1,某某会展中心101,2023/8/20 14:20 101,小米101,1001,1,某某会展中心102,2023/8/21 14:20 2、在线程组下添加【CSV数据文件设置】元件 3、CSV文件数据的循环控…

数据库动态视图和存储过程报表数据管理功能设计

需求&#xff1a;需要将ERP的报表数据挪到OA中&#xff0c;但是OA表单设计不支持存储过程动态传参&#xff0c;所以需要设计一个系统&#xff0c;可以手动配置&#xff0c;动态显示原本ERP的报表数据&#xff0c;ERP报表是存在数据库的视图和存储过程中 思路&#xff1a;因为E…

c#按照时间进行数据存储(不用数据库)

概要介绍 按照日期生成文件夹&#xff0c;按照时间生成文件名&#xff0c;存储字符串。 可以用于简单数据记录&#xff08;如果数据存储考虑格式文本&#xff0c;保存为csv格式&#xff09; 实现效果 调用方法 SaveText.saveStr("测试字符串"DateTime.Now.ToStrin…

高效排队,紧急响应:RabbitMQ Priority Queue全面指南【RabbitMQ 九】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 高效排队&#xff0c;紧急响应&#xff1a;RabbitMQ Priority Queue全面指南 引言前言第一&#xff1a;初识RabbitMQ Priority Queue插件插件的背景和目的&#xff1a;为什么需要消息优先级&#xff1…

我的NPI项目之Android 安全系列 -- Google Wallet and Secure Element(SE)

随着电子支付的兴起&#xff0c;越来越多的支付方式出现在我们的生活中。其中就有基于NFC的“碰一碰”的支付&#xff0c;支付宝的“扫一扫”支付&#xff0c;我们还知道有Google Pay(Wallet), Apple Pay(Wallet)。作为Android BSP的开发者&#xff0c;我比较关心的是Google Pa…

Processon的使用以及流程图的绘制

目录 一、ProcessOn 1.2 官方网站 门诊流程图 会议OA流程图 药库采购入库流程图 ​住院流程图 二、Axure自定义元件库 2.1 新建元件库 2.2 自定义元件 2.3 添加元件库 一、ProcessOn ProcessOn是一款在线的流程图、思维导图、组织结构图、网络拓扑图等多种图表类型…

2020年第九届数学建模国际赛小美赛A题自由泳解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 A题 自由泳 原题再现&#xff1a; 在所有常见的游泳泳姿中&#xff0c;哪一种最快&#xff1f;哪个冲程推力最大&#xff1f;在自由泳项目中&#xff0c;游泳者可以选择他们的泳姿&#xff0c;他们通常选择前面的爬行。然而&#xff0c;游泳…

Java基础面试题小结

基础面试题 Java语言简介 Java是1995年由sun公司推出的一门高级语言&#xff0c;该语言具备如下特点: 简单易学&#xff0c;相较于C语言和C&#xff0c;没有指针的概念&#xff0c;所以操作和使用是会相对容易一些。平台无关性&#xff0c;即Java程序可以通过Java虚拟机在不…

MongoDB 与 Python 的交互

文章目录 第1关&#xff1a;MongoDB 与 Python 的交互 第1关&#xff1a;MongoDB 与 Python 的交互 编程要求 根据提示&#xff0c;在右侧编辑器 Begin-End 处补充代码&#xff0c;完成右侧程序。 测试说明 点击评测&#xff0c;平台会对你编写的代码进行测试。 import pymo…

tomcat优化

目录 一.tomcat的优化 二.nginxtomcat负载均衡、动静分离 三.nginx的反向代理类型 四.nginx的调度算法&#xff08;调度策略、负载均衡模式&#xff09; 五.nginx反向代理如何实现会话保持 一.tomcat的优化 tomcat的优化分为&#xff1a;系统优化&#xff0c;配置文件参数…

GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

这章是接上一章&#xff0c;使用RPC包&#xff0c;序列化中没有详细去讲&#xff0c;因为这一块需要看的和学习的地方很多。并且这一块是RPC中可以说是最重要的一块&#xff0c;也是性能的重要影响因子。今天这篇主要会讲其使用方式。 文章目录 Protocol Buffers V3 背景以及概…

RHEL7.5编译openssl1.1.1w源码包到rpm包

openssl1.1.1w下载地址 https://www.openssl.org/source/ 安装依赖包 yum -y install curl which make gcc perl perl-WWW-Curl rpm-build wget http://mirrors.aliyun.com/centos-vault/7.5.1804/os/x86_64/Packages/perl-WWW-Curl-4.15-13.el7.x86_64.rpm rpm -ivh pe…

JVM之堆学习

一、Java虚拟机内存结构图 二、堆的介绍 1. 前面学习的程序计数器&#xff0c;虚拟机栈和本地方法栈都是线程私有的&#xff0c;堆是线程共享的&#xff1b; 2. 通过 new 关键字&#xff0c;创建的对象都会使用堆内存&#xff0c;其特点是&#xff1a; 它是线程共享的&#x…

【每日一题】【面试经典150 | 动态规划】爬楼梯

Tag 【动态规划】【数组】 题目来源 70. 爬楼梯 题目解读 有过刷题「动态规划」刷题经验的读者都知道&#xff0c;爬楼梯问题是一种最典型也是最简单的动态规划问题了。 题目描述为&#xff1a;你每次可以爬 1 或者 2 个台阶&#xff0c;问爬上 n 阶有多少种方式。 解题思路…

智能优化算法应用:基于探路者算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于探路者算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于探路者算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.探路者算法4.实验参数设定5.算法结果6.参考文…