mysql的innodb数据存储结构

https://www.cnblogs.com/qq289736032/p/11160143.html

数据库磁盘读取与系统磁盘读取

1,系统从磁盘中读取数据到内存时是以磁盘块(block)为基本单位,位于同一个磁盘块中的数据会被一次性读取出来。

2,innodb存储引擎中有页(Page)的概念,页是数据库管理磁盘的最小单位,innodb存储引擎中默认每个页的大小为16kb,每次读取磁盘时都将页载入内存中。

3,系统一个磁盘块的大小空间往往没有16kb这么大,因此innodb每次io操作时都会将若干个地址连续的磁盘块的数据读入内存,从而实现整页读入内存

问题:数据库的数据结构时怎样的?B树和B+树有什么区别,为什么选择B+树作为存储数据的结构,而不是B树?

B树和B+树

Btree

一个M阶的B-tree有如下特点

1,每个节点最多有m个孩子(分叉),

2,除了根节点和叶子节点外,其他每个节点至少有ceil(m/2)个孩子

3,若根节点不是叶子节点,则至少有两个孩子

4,所有叶子节点都再同一层,且不包含其他关键字信息

5,每个非终端节点包含n个关键字信息,关键字的个数n满足ceil(m/2)-1<=n<= m-1 其中m为阶数

6,ki(i=1,…n)为关键字,且关键字(主键primary key)升序排序。

7,. Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1);

在这里插入图片描述

B-tree每个节点都包含指针,key以及data,每个节点含有三个指向子节点的指针和两个升序排序的关键字(key)

模拟查找关键字29的过程:

  1. 根据根节点找到磁盘块1,读入内存。【磁盘I/O操作第1次】

  2. 比较关键字29在区间(17,35),找到磁盘块1的指针P2。

  3. 根据P2指针找到磁盘块3,读入内存。【磁盘I/O操作第2次】

  4. 比较关键字29在区间(26,30),找到磁盘块3的指针P2。

  5. 根据P2指针找到磁盘块8,读入内存。【磁盘I/O操作第3次】

  6. 在磁盘块8中的关键字列表中找到关键字29。

分析上面过程,发现需要3次磁盘I/O操作,和3次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。而3次磁盘I/O操作是影响整个B-Tree查找效率的决定因素。

B树上大部分的操作(插入、删除、查询)所需要的磁盘存取次数和B树的高度是成正比的,并且B树是尽量多的在节点上存储信息,保证导数尽量少,在B树中可以检查多个子结点,由于在一棵树中检查任意一个结点都需要一次磁盘访问,所以B树避免了大量的磁盘访问,减少了磁盘I/O。

B+tree

毫无疑问,减少树的高度是有效减少IO次数提高效率的方式,b-tree结构每个节点不仅包含key值,还有data值,每一个页的存储(16kb)是有限的,每个节点可容纳的指针和keydata是有,如果data数据含量大,那么一个页保存的指针和key的数量就会减少,从而增页节点的数量,这就增加btree的深度,增加读取磁盘的次数,进而影响查询效率

而在b+tree中,一个节点记录的都是key值和指针(排除了data值),这样就可以记录更多的key值,其key值是升序排序,

在这里插入图片描述

B+tree和b-tree有如下不同点

1,非叶子节点只存储键值信息(key信息)

2,所有叶子节点之间都有一个链指针,数据都存放再叶子节点中

推算

innodb存储引擎一页的大小为16kb,一般主键类型为int占4个字节,或bigint占8个字节,指针类型页一般4个或8个字节,也就是说一个页中大概存储161024/16=1024个key,深度为3的B+tree索引(三页)可以维护10241024*1024=10亿条记录,实际情况每个节点不可能填满,B+tree的高度一般为2-4曾,mysql的innodb存储引擎将根节点常驻内存,也就是查找某一键值的行记录最多需要1-3次磁盘IO操作

页的概念

页是innodb读取磁盘的最小单位,整页整页的读取

页分为,数据页(BTreeNode),Undo页(undo Log page),系统页(Systempage),事务数据页(Transaction SystemPage)每个数数据页的大小为16kb,每个page使用一个32位int值来表示,

一个page的基本结构

在这里插入图片描述

1,0-38:page头部,id,类型信息等占38个字节,头部保存两个指针分别指向前一个page和后一个page,page是一个双向列表

2,38-16376:不同的类型页所含的数据不同,这部分空间包含系统记录(SystemRecord)和用户记录(UserRecord),我们表中的一条条记录就放在UserRecord部分,UserRecord存放的内容可以是以下内容

a,主键索引树非叶子节点,B+tree索引,和指针

b,主键索引树叶子节点,key和data(就是记录本身)

c,辅助键索引树非叶子节点,B+tree辅助索引

d,辅助键索引树叶子节点,key和data(这里的data是主键)

页可以装很多种数据信息,有的页是B+树的所有主键索引,有的页是B+树的叶子节点也就是数据记录本身,有的页是我们创建的二级索引,

16376-16384:page尾部

页和节点的关系

页和节点没有强相关关系

由页组成的链表,页之间是双向列表,页里面的数据是单向链表,这种结构组成了主键索引B+树,组成了叶子节点数据。

在这里插入图片描述

定位一条记录的过程,select * from table where id = 29

系统经过解析sql语句,首先读取装有非叶子节点page页,遍历非叶子节点,这个过程随着节点的遍历会将一个或多个page页加载到内存,直到定位到这条记录的叶子节点,然后遍历找出该条记录。

如果使用了二级索引则先读取二级索引page遍历这个二级索引,找到装有主键信息叶子节点page页,遍历找到该主键。然后再根据主键索引寻找到该条记录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL InnoDBMySQL 一种常用的数据存储引擎,其特点是支持事务处理和外键约束,并且具有良好的性能和可伸缩性。 InnoDB数据存储是以表为单位的,每个表都有一个对应的数据文件,用于存储表数据。除了数据文件之外,InnoDB 还有一个索引文件,用于存储索引信息。 InnoDB 使用了一种称为 B+ Tree 的算法来存储和维护索引,这种算法使得索引查询的效率很高。同时,InnoDB 还支持自适应哈希索引,可以提高对哈希索引的查询性能。 InnoDB 还有一个叫做缓冲池的功能,用于缓存常用的数据和索引,可以提高数据访问的效率。 总的来说,MySQL InnoDB 是一种高效的数据存储引擎,适用于许多不同的应用场景。 ### 回答2: MySQL InnoDB是一种常用的数据库存储引擎,它提供了可靠、高性能的数据存储方式。 InnoDB使用B+树索引来组织数据,这种索引结构能够快速地定位到所需的数据行,提高了查询速度。此外,InnoDB还支持主键索引、唯一索引、全文索引等多种索引类型,以满足不同的查询需求。 InnoDB还支持事务处理,它能够保证在多个并发操作的情况下,数据的一致性和完整性。当需要进行一系列的数据操作时,可以通过事务来确保这些操作要么全部成功,要么全部失败,避免了数据的不一致性问题。 另外,InnoDB还提供了行级锁和事务隔离级别。行级锁可以在并发操作时,更细粒度地锁定数据行,提高了并发操作的效率。而事务隔离级别则可以控制事务之间的相互影响,避免了数据的混乱和冲突。 此外,InnoDB还支持自动增量列和外键约束。自动增量列可以自动生成唯一标识,简化了开发的复杂度。而外键约束可以保证数据的一致性,防止出现不合法的引用。 总之,InnoDB是一种功能强大的数据存储引擎,它具有高性能、可靠性和完整性保证等特点,适用于各种规模的应用和数据存储需求。 ### 回答3: InnoDBMySQL关系型数据库管理系统的一种数据存储引擎。它拥有许多独特的特性,可以提供高度的数据完整性和可靠性。 首先,InnoDB使用事务来管理数据的插入、删除和更新操作。这意味着所有的操作要么全部成功完成,要么全部回滚。这保证了数据的一致性和完整性。 其次,InnoDB支持行级锁定。这意味着在并发操作时,只有被修改的行会被锁定,而不是整个数据表。这提高了多用户环境下的并发性能。 另外,InnoDB还支持外键约束。这意味着在不同的表之间创建关联关系,确保数据的一致性和完整性。当删除或更新主表的记录时,相关的外键记录也会相应进行操作,防止出现数据不一致的情况。 此外,InnoDB还具有自动崩溃恢复的能力。它具有一个称为“重做日志”的机制,可以记录所有在事务所做的修改,以便在意外崩溃或系统故障后可以恢复数据到事务开始之前的状态。 总的来说,InnoDBMySQL一种强大的存储引擎,它提供高度的数据完整性和可靠性,同时还具备了高并发性和灵活性。在开发和管理大规模数据库时,InnoDB是一个非常理想的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值