InnoDB存储引擎

1、InnoDB = 内存结构 + 磁盘结构

2、为什么要设计为内存 + 磁盘两部分?

磁盘结构是数据持久化 + 内存结构是缓存数据提升效率

3、内存结构 + 磁盘结构各个部分是什么作用?

4、InnoDB存储引擎创建的表对应的数据文件在哪里?

不用思考,想持久,肯定在磁盘或者其他存储介质。

表在数据库子目录(以.ibd为文件的后缀)5.7及以后的版本是默认生成独立表空间(也可以配置都在系统表的空间)。innodb_file_per_table[=ON|OFF]

5、什么是表空间文件?

存储表中数据的文件,文件大小油存储的数据决定,不同表空间文件存储数据的种类也有所不同,

mysql中五类表:系统表空间、独立表空间、通用表空间、临时表空间、撤销表空间

6、表空间和表空间文件的关系?

表空间 = mysql管理数据设计的一种数据结构。

表空间文件 = 对数据结构的具体实现,以文件形式存储在磁盘上。

7、用户数据在表空间中是怎么存储的?

数据行 = 是用户数据在表空间文件的存储方式

表空间 = 段(segment)+ 区组(group)+区(extent)+页(page)+数据行

page = InnoDB磁盘管理的最小单位

8、为什么使用页(page)?

mysql的页是16KB(应用层定义的一种数据结构)。操作系统通常是4KB(不够mysql用,小导致频繁的磁盘IO)。

局部性原理:将来要用的数据和当前访问的数据在空间上是临近的。

从磁盘中读取一页数据放在内存中,下次查询到数据还在这个页就可以直接读。不需要IO。

9、什么是局部性原理?

局部性原理是指程序在执行时呈现出局部性规律,在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域,局部性通常有两种形式:时间局部性和空间局部性

局部性原理 = 时间局部性 + 空间局部性

Temporal Locality :一个信息正在被访问,那么近期可能还会被再次访问。

Spatial Locality:将来要用的信息大概率与正在使用的信息在空间地址上是临近的。

10、数据页有哪些基本特性是必须掌握的?

innodb_page_size可以进行设置(必须是数据块4KB的整数倍,保证操作系统和磁盘交互时候数据块的完整性,不被分割和浪费)4、8、16、32、64.这几种选项。

不同场景,mysql有多种不同的页,不论那种类型都包含页头(File Header)和页尾(File Trailer)。中间的页主体信息根据不同的类型有不同的结构。有一个存储数据和索引的,索引页(也叫做数据页)。页的主题信息使用数据”行“进行填充。

11、查询的数据超过1页的大小,怎么提高查询效率?区

磁盘中每个页内部的地址都是连续的。

不同的页在磁盘中是不是连续? 不一定,这个

如果页不连续对访问是否有影响?会,磁盘随机访问增多。

InnoDB如何保证页在磁盘中的连续性?区(1MB=64个页)

如果跨页读数据页大概率在附近的地址,可以大幅度减少磁头移动+统计读的频繁的区的页,将整个区放入内存中(buffer poll)。

a. 页在区内是相邻的:磁盘顺序I/O,可以大幅提升效率
b. 页在区内但不是相邻的:可以大幅减少碰头移动,可以提升效率
c. 页在不同的区:还是要发生随机I/O,不能提升效率

12、当表中数据很少时如何避免空间浪费?

为了节省空间。建表只创建7个初始页(6个),而不是一个完整的区,可以通过sql查看。

这些零散页会放在表空间中一个叫碎片区的区域。当碎片到32个页,后续每次都是完整的区来存储数据。

13、如果访问的数据跨区了怎么办?区组

这个问题就是,InnoDB是如何高效的管理区?

区组  = 256个区(256MB)。通过区组可以在物理层面非常高效的管理和定位到每个区。

第一个区组的首个区的前四页特殊。

File Space Header:表空间和区组中条目信息

Insert Buffer Bitmap:change Buffer相关信息

File Segment inode:段引根信息

B-tree Node:索引根信息

其他区组中首个区的结构都一样,前两个分别是:

Extent Descriptor(XDES):区组条目信息--记录每个区的偏移

insert Buffer Bitmap:Change Buffer相关信息

区组里面的区用双向链表连接。

14、以上这些数据结构还有优化的空间吗?段

上面讲到的区、区组还有页这种都是物理结构

引入一个逻辑概念,段;段并不对应表空间中的连续的物理区域。

段:区分不同功能的区和在碎片区中的页。 叶子节点段 和非叶子节点段 。

B+树索引中的叶子 、非叶子节点对应。

简单理解,非叶子节点段存储和管理索引树,叶子节点段存储和管理实际数据。

图中能看到。左侧是物理结构,右侧是逻辑结构。

15、上面说的所有操作是在哪里进行的?

所有的数据库操作都是在内存中进行的,最终会把修改结果刷回磁盘中对应的页。

16、查询数据时MySQL会一次把表空间中的数据全部加载到内存吗?

InnoDB存储引擎创建表,查询数据时候会根据索引,定位到目标数据所在的页,然后加载到内存。

17、每查询一条数据都要进行一次磁盘IO吗?

不一定,如果数据行已经在内存,就直接返回结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值