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吗?
不一定,如果数据行已经在内存,就直接返回结果。

1972

被折叠的 条评论
为什么被折叠?



