首页 > 数据库 >MySQL InnoDB 是怎么使用 B+ 树存数据的?

MySQL InnoDB 是怎么使用 B+ 树存数据的?

时间:2023-09-01 13:34:51浏览次数:46  
标签:存储 树存 索引 InnoDB MySQL 数据 节点

这里限定 MySQL InnoDB 存储引擎来进行阐述,避免不必要的阅读歧义。

首先通过一篇文章简要了解下 B 树的相关知识:你好,我是B树

B+ 树是在 B 树基础上的变种,主要区别包括:

  • 1、所有数据都存储在叶节点,其它几点作为索引存储。

  • 2、数据节点添加链指针,便于横向检索。

数据是怎么检索的?

从根节点作为起始检索点,逐层向下检索,直至找到目标数据。检索的路径复杂度度跟树的高度成正比。

如上第一点,B+ 树所有数据存储于叶子节点,那么路径上就可以存储更多的索引指针数据,进而使得数据的高度降低。能够极大的提升检索效率。

InnoDB 数据文件空间管理

image

Tablespaces -> Segments -> Extends -> Pages 级联。

Page <-> Row

Page 是 MySQL 最小的存储管理单元,默认的大小为 16KB。最大行数据需要稍微小于 Page 大小的 1/2,超过的化作额外存储处理。

Page <-> B+ 树

MySQL InnoDB 表会使用一种特殊的索引聚簇索引来存储行数据,索引中会包含主键数据。

索引的底层数据结果为 B+ 树(其它特殊此处不做赘述)。

如下图:

image

一个节点对应一个 Page,MySQL 每次读取的基本操作单元。

B+ 树的高度与表数据存储量大小

I:索引节点,每个节点可存储的指针数。

H:树的高度。

R:叶节点,每个节点可以存储的记录数。

一张表可以存储的记录数:N = pow(I, H - 1) * R。

标签:存储,树存,索引,InnoDB,MySQL,数据,节点
From: https://www.cnblogs.com/niejunlei/p/17671559.html

相关文章

  • mysql字符集批量修改
    修改所有数据库字符集SELECTCONCAT('ALTERDATABASE',SCHEMA_NAME,'CHARACTERSETutf8mb4COLLATEutf8mb4_bin;')as'Fanrncho'FROMinformation_schema.`SCHEMATA`WHEREDEFAULT_CHARACTER_SET_NAMERLIKE'utf8mb4'ANDSCHEMA_NAME......
  • mysql数据库性能优化参考
    原文链接:https://blog.csdn.net/qq_34777982/article/details/125788079硬件和操作系统层面的优化硬件:cpu、内存、磁盘io、网络带宽操作系统:应用文件句柄(ulimit-aopenfiles)网络配置架构设计层面的优化集群方式(主从集群或者主主集群):避免单点故障读写分离:读写分开,将压力分担,避......
  • mysql备份恢复
    备份某个表:mysqldump-uusername-ppassworddatabase_nametable_name>backup_file.sql备份多个表:mysqldump–uusername-ppassworddatabase_nametable1table2>BackupName.sql备份整个库:mysqldump-uusername-ppassworddatabase_name>backup_file.sql备份多......
  • Mysql主从复制(一主一从)+Mycat(windows-1.X版本)实现读写分离
    项目中,如果数据量大的情况下,可以使用【数据库主从复制+读写分离】的方式优化,其他方式也很多,这里只记录下这种方式一、说明1.需要的环境等:序号环境说明1mysql5.7服务器两台数据库服务器,一台作为主数据库,一台作为从数据库2jdk安装mycat的时候会用到jdk3my......
  • 读写分离---mysql的主主结构和主从架构
    前言:为什么要对mysql做优化?  因为数据都来源于数据库,如果数据库慢了,无论是多线程、各种识别模式优化还是很慢,因为查sql就很慢。  官方说法:单表2000万数据,增删改查就到达瓶颈了。所以为了保证查询效率,得让每张表的大小得到控制。 Mysql架构:实际生产过程中,查询业务......
  • mysql基础
    --创键数据库test(如果不存在)CREATEDATABASEIFNOTEXISTStest--删除数据库test(如果存在)DROPDATABASEIFEXISTStest--使用该数据库USEschool--表名或字段名是特殊字符用``包含(tab键上......
  • mysql 创建只读权限账号
    命令行登录mysql-uroot-p创建只读权限的账号【将<username>替换为用户名, <password>替换为密码。'%' 表示该账号可以从任何主机连接。如果希望限制连接的主机,可以将 '%' 替换为具体的主机名或IP地址。】CREATEUSER'<username>'@'%'IDENTIFIEDBY'<password>......
  • 详解 canal 同步 MySQL 增量数据到 ES
    canal是阿里知名的开源项目,主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费。这篇文章,我们手把手向同学们展示使用canal将MySQL增量数据同步到ES。1集群模式图中server对应一个canal运行实例,对应一个JVM。server中包含1..n个instance,我......
  • MySQL 使用Navicat delete/insert into/update 大量数据表锁死,kill的线程后线程处于ki
      MySQL使用delete/insertinto/update大量数据表锁死,kill的线程后线程处于killed状态问题解决实际生产环境问题描述:使用Navicat备份BigData数据表时不小心点到了取消按钮,导致数据表被锁。  查看MySQL线程队列,找到刚刚执行的SQL看是属于什么状态。showprocessli......
  • mysql COALESCE用法 ,GROUP_CONCAT分组用法
    sdroot.dept_namecompany,COALESCE((casewhensd5.dept_name=sdroot.dept_namethennullelsesd5.dept_nameend),(casewhensd4.dept_namein(sdroot.dept_name,sd5.dept_name)thennullelsesd4.dept_nameend),(casewhen......