mysql索引结构

多种数据结构

在数据库索引领域,特别是MySQL的InnoDB存储引擎中,聚簇索引(Clustered Index)和非聚簇索引(也称为二级索引,Secondary Index)是两种主要的索引类型。这些索引类型在数据结构的选择上有所不同,而Hash结构、二叉搜索树(BST)、AVL树、B-Tree、B+Tree和R-Tree是常见的索引数据结构。下面我将对这些数据结构进行类比,并特别关注它们在InnoDB中的使用情况。

1. Hash结构

  • 特点:Hash索引基于哈希表实现,提供O(1)复杂度的查找性能,适用于等值查询。
  • 在InnoDB中的应用:InnoDB不直接支持传统的Hash索引,但提供了自适应哈希索引(Adaptive Hash Index, AHI),该索引是自动生成的,不能人为干预,且主要用于等值查询优化。

2. 二叉搜索树(BST)

  • 特点:每个节点最多有两个子节点(左子节点和右子节点),左子节点的值小于父节点,右子节点的值大于父节点。
  • 在InnoDB中的应用:由于BST在数据量大时高度可能很高,导致查询效率下降,因此InnoDB不直接使用BST作为索引数据结构。

3. AVL树

  • 特点:AVL树是一种自平衡的二叉搜索树,任何节点的两个子树的高度最大差别为1。它通过旋转操作来保持树的平衡。
  • 在InnoDB中的应用:InnoDB同样不直接使用AVL树作为索引数据结构,因为B+树在数据库索引中提供了更好的性能。

4. B-Tree

  • 特点:B-Tree是一种多路平衡搜索树,每个节点可以有多个子节点。所有叶子节点位于同一层,且所有叶子节点包含全部关键字信息,并指向记录数据的指针。
  • 在InnoDB中的应用:虽然InnoDB的索引实现基于B+Tree,但B-Tree作为其基本思想的一部分,也值得提及。然而,InnoDB最终选择了B+Tree作为索引的主要数据结构。

5. B+Tree

  • 特点:B+Tree是B-Tree的一种变体,所有值都出现在叶子节点,且叶子节点之间互相链接。非叶子节点仅存储关键字信息,用于索引,不存储实际数据。
  • 在InnoDB中的应用:InnoDB的聚簇索引和非聚簇索引都是基于B+Tree实现的。聚簇索引将表数据按照主键的顺序存储在磁盘上,非聚簇索引则存储索引列和对应数据的主键指针。

6. R-Tree

  • 特点:R-Tree是一种用于空间数据索引的数据结构,如地理信息系统(GIS)中的点、线和多边形等空间对象。
  • 在InnoDB中的应用:InnoDB存储引擎并不直接支持R-Tree作为索引数据结构,因为它主要用于处理非空间数据。对于空间数据索引,MySQL提供了其他存储引擎,如MyISAM(尽管MyISAM也不直接支持R-Tree,但MySQL有专门的空间扩展来支持空间数据)。

类比总结

数据结构特点在InnoDB中的应用
Hash结构O(1)复杂度查找,适用于等值查询自适应哈希索引,用于等值查询优化
二叉搜索树(BST)高度可能较高,导致查询效率下降不直接使用
AVL树自平衡二叉搜索树,保持树的高度较低不直接使用
B-Tree多路平衡搜索树,所有叶子节点位于同一层索引实现的基础思想之一,但InnoDB最终选择B+Tree
B+TreeB-Tree的变体,所有值在叶子节点,叶子节点间互相链接聚簇索引和非聚簇索引的主要数据结构
R-Tree用于空间数据索引的数据结构不直接在InnoDB中使用,适用于其他存储引擎或MySQL的空间扩展

综上所述,InnoDB存储引擎在索引的实现上主要选择了B+Tree作为其核心数据结构,因为它在数据库索引的多种需求下提供了良好的性能和灵活性。

MySQL的BTree索引结构

在这里插入图片描述
在这里插入图片描述
在InnoDB存储引擎中,表的数据以多种方式存储和组织,主要依赖于其行格式(Row Format)和表空间(Tablespace)的结构。下面详细解释这些组成部分和格式。

1. 行格式 (Row Formats)

InnoDB提供了多种行格式以优化存储和访问效率,主要包括:

  • COMPACT:是InnoDB的默认行格式(从MySQL 5.0.3开始),它紧凑地存储数据,减少了空间浪费。
  • REDUNDANT:是一种早期的行格式,为了向后兼容而保留。它存储了大量的冗余信息,使得每行数据都很大。
  • DYNAMICCOMPRESSED:这两种格式都是为了处理大字段(如BLOB、TEXT)而设计的。DYNAMIC允许将大字段的数据存储在数据页之外,仅保留一个指针在数据页中;COMPRESSED则进一步对这些数据进行压缩。
数据页组成部分
  • 文件头 (File Header):包含页的通用信息,如页号、页类型、校验和等。
  • 页头 (Page Header):包含页的状态信息,如页是否为空、已删除记录的数量、页中记录的数量等。
  • 最大最小记录 (Infimum + Supremum):页中的两条虚拟记录,分别作为记录的边界,保证页中的记录始终有序。
  • 用户记录 (User Records):实际存储的表记录。
  • 空闲空间 (Free Space):页中未使用的空间,可用于插入新记录或记录更新。
  • 页目录 (Page Directory):一个槽数组,用于快速定位页中的记录。
  • 文件尾 (File Tailer):页的末尾,包含页的校验和,用于页的完整性验证。

2. 表空间 (Tablespaces)

InnoDB的表数据存储在表空间中,表空间可以是系统表空间或独立表空间。

  • 系统表空间 (System Tablespace):包含系统数据字典、撤销日志、回滚段等,以及用户表的数据(如果配置为使用系统表空间)。
  • 独立表空间 (File-per-table Tablespace):每个表都有自己独立的表空间文件(.ibd),这样可以更方便地管理表和表空间。
  • 撤销表空间 (Undo Tablespace):专门用于存储撤销日志,这些日志用于事务的回滚操作。
  • 临时表空间 (Temporary Tablespace):存储临时表和查询的中间结果。

3. 区和段 (Extents and Segments)

  • 区 (Extent):InnoDB存储引擎分配空间的基本单位,默认大小为1MB(64个连续的页)。
  • 段 (Segment):区被进一步组织成段,段是表的一部分,可以包含多个区。段可以是索引段、数据段、撤销段等。

总结

InnoDB的存储结构通过行格式、页、区、段和表空间的多级组织,提供了高效的数据存储和访问能力。不同的行格式适用于不同的应用场景,而表空间则提供了灵活的数据管理方式。了解这些结构对于优化数据库性能至关重要。

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

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

相关文章

最优化原理(笔记)

内积是线性代数运算的一个结果,一行*一列。 内积的性质! 什么是范数??? 对称矩阵:关于主对角线对称! 正定对称矩阵: 二阶导是正定的,f(x)就是严格的凸函数!&a…

spring部分源码分析及Bean的生命周期理解

前言: 本文整体框架是通过refresh方法这个入口进入分析:分析IOC容器的创建及一些Bean的生命周期的知识点,写得确实一般般,感觉自己的有些前置知识并没有理解的很到位,所以,这篇文件先记录一下,…

推荐一款开箱即用、开源、免费的中后台管理系统模版

项目介绍 vue-pure-admin 是推荐一款开箱即用、开源(遵循MIT License开源协议)、免费的中后台管理系统模版,完全采用 ECMAScript 模块(ESM)规范来编写和组织代码,使用了最新的 Vue3、 Vite、Element-Plus、…

无人机图像目标检测技术详解

当前研究领域的热点之一。无人机搭载的高清摄像头能够实时捕获大量图像数据,对这些数据进行有效的目标检测对于军事侦察、环境监测、灾害救援等领域具有重要意义。本文将对无人机图像目标检测技术进行详解,包括图像处理技术、目标检测算法、关键技术应用…

pdf2docx - pdf 提取内容转 docx

文章目录 一、关于 pdf2docx主要功能限制 二、安装1、 PyPI2、从remote安装3、从源码安装4、卸载 三、转化 PDF例 1: convert all pages例 2: 转换指定页面例 3: multi-Processing例 4: 转换加密的pdf 四、提取表格五、命令行交互1、按页面范围2、按页码3、Multi-Processing 六…

gitee设置ssh公钥密码频繁密码验证

gitee中可以创建私有项目,但是在clone或者push都需要输入密码, 比较繁琐。 公钥则可以解决该问题,将私钥放在本地,公钥放在gitee上,当对项目进行操作时带有的私钥会在gitee和公钥进行验证,避免了手动输入密…

C语言数据结构课设:基于EasyX前端界面的飞机订票系统

数据结构课程设计说明书 学 院、系: 软件学院 专 业: 软件工程 班 级: 学 生 姓 名: 范 学 号: 设 计 题 目: 飞机订票系统 起 迄 日 期: 2024年6月18日~ 20…

【测试能力提升-AI】AI介绍

注释: 搞python的最终梦想,搞机器,玩深度,通网络,知模型,拿下AI技术,尽管只是测试,但是也是有梦想的 1. 目标 完成AI任务 ---- 掌握成熟、标准的任务解决方法掌握AI工具 ---- 完成…

2022 年中高职组“网络安全”赛项-海南省省竞赛任务书-1-B模块-B-4Web渗透测试

前言 本章节我将尝试操作B-4模块的渗透测试,搭建环境很难,还望大家点点赞多多支持! 任务概览 最后4、5、6有一定的难度。 环境要求 kali Linux192.168.41.2Web服务器(假设为PYsystem 2020 模拟平台)192.168.41.7交换…

postman接口测试实战篇

击杀小游戏接口测试 接口测试简单介绍击杀小游戏代码下载单接口测试(postman)接口关联并参数化接口测试简单介绍 首先思考两个问题:1.接口是什么?2.接口测试是什么? 1.我们总是把接口想的很复杂,其实呢,它就是一个有特定输入和输出参数的交互逻辑处理单元,它不需要知…

【实战】Spring Cloud Stream3.0 整合RocketMq

文章目录 前言技术积累Spring Cloud Stream3.0新特性RocketMq简介 实战演示引入Maven依赖增加application配置消息生产者消息消费者 前言 相信很多同学用使用过rocketmq消息中间件,且大多情况下是使用原生的rocketmq-spring-boot-starter 进行集成然后创建一个rock…

Spring中Bean的循环依赖

目录 定义: 循环依赖的后果: 一:三级缓存 1、大概的思路: 注意: 2、执行过程: A半完成: B完成: A完成: 注: 二:Lazy 定义: …

入门C语言只需一个星期(星期三)

点击上方"蓝字"关注我们 01、基本数据类型 char 1 字节 −128 ~ 127 单个字符/字母/数字/ASCIIsigned char 1 字节 −128 ~ 127 -unsigned char 1 字节 0 ~ 255 -int…

【SpringCloud】微服务远程调用OpenFeign

工作原理流程图 上代码 common中添加依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency><groupId>org.spri…

CV13_混淆矩阵、F1分数和ROC曲线

1.1 混淆矩阵Confusion Matrix 混淆矩阵&#xff08;Confusion Matrix&#xff09;是机器学习和统计学中用于描述监督学习算法性能的特定表格布局。它是一种特定类型的误差矩阵&#xff0c;可以非常直观地表示分类模型在测试数据集上的预测结果与实际结果之间的对比。 混淆矩…

【数据结构】初识集合框架

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

Python爬虫(6) --深层爬取

深层爬取 在前面几篇的内容中&#xff0c;我们都是爬取网页表面的信息&#xff0c;这次我们通过表层内容&#xff0c;深度爬取内部数据。 接着按照之前的步骤&#xff0c;我们先访问表层页面&#xff1a; 指定url发送请求获取你想要的数据数据解析 我们试着将以下豆瓣读书页…

河南萌新联赛2024第(二)场:南阳理工学院

A 国际旅行Ⅰ D A*BBBB F 水灵灵的小学弟 H 狼狼的备忘录 I 重生之zbk要拿回属于他的一切 J 这是签到 ##A 国际旅行Ⅰ 链接&#xff1a;https://ac.nowcoder.com/acm/contest/87255/A 来源&#xff1a;牛客网 题目描述 很久很久以前&#xff0c;有 n n n 个国家&#xff0c;第…

字符的统计——423、657、551、696、467、535

423. 从英文中重建数字 最初思路 首先要有一个指针&#xff0c;对于3/4/5为一组地跳跃。起初想的是后瞻性&#xff0c;如果符合0-9任意&#xff0c;则更换index、跳跃。此时写了一个函数&#xff0c;用来判断s的截取段和0-9中有无符合。这个思路并没有进行下去&#xff0c;虽然…

昇思25天学习打卡营第九天|本地安装mindspore之一|Linux的系统在vmware上的安装以及mindspore的安装

课程已经学完了&#xff0c;打算再深入一些。初步的想法是&#xff0c;在本地安装&#xff0c;本地执行。 根据老师的指引&#xff0c;MindSpore官网&#xff0c;“https ://www.mindspore.cn/install/”&#xff0c;注意&#xff0c;因为csdn博客编辑器的原因&#xff0c;当我…