【MySQL从入门到精通】【高级篇】(十二)InnoDB数据存储结构概述
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
❤️ 2. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
😁 5. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
全网同名【码农飞哥】欢迎关注,个人VX: wei158556
1. 简介
上一篇文章我们介绍了【MySQL从入门到精通】【高级篇】(十一)Hash索引、AVL树、B树与B+树对比。这篇文章接着来介绍InnoDB数据存储结构。
2. 数据库的存储结构:页
索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的存储引擎负责对表中数据的读取和写入工作。不同存储引擎中存放格式一般不同,甚至有的存储引擎比如Memory都不用磁盘来存储数据。在InnoDB中数据是存储在ibd文件中。
2.1. 磁盘与内存交互基本单位:页
InnoDB 将数据划分为若干个页,InnoDB中页的大小默认为16KB。
以页作为磁盘和内存之间交互的基本单位,也就是说一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中16KB内容刷新到磁盘中。也就是说:在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载。也就是说,数据库管理存储空间的基本单位是页(Page),数据库I/O操作的最小单位是页,一个页中可以存储多个行记录。
记录是按照行来存储的,但是数据库的读取并不以行为单位,否则一次读取(也就是一次IO操作)只能处理一行数据,效率会非常低。
2.2. 页结构概述
页a、页b、页c…页n这些页可以不在物理结构上相连,只要通过双向链表 相关联即可。每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。
2.3. 页的大小
不同的数据库管理系统(简称DBMS)的页大小不同。比如在MySQL的InnoDB存储引擎中,默认页的大小是16KB,我们可以通过下面的命令来查看:
mysql>show variables like '%innodb_page_size%'
- 1
2.4. 页的上层结构
另外在数据库中,还存在着区(Extent),段(Segment)和表空间(Tablespace)的概念。行、页、区、段、表空间的关系如下图:
- 区(Extent): 是比页大一级的存储结构,在InnoDB存储引擎中,一个区会分配64个连续的页。 因为InnoDB中页大小默认是16KB,所以一个区的大小是64*16KB=1MB。
- 段(Segment): 由一个或多个区组成,区在文件系统是一个连续分配的空间(在InnoDB中是连续的64个页),不过在段中不要求区与区之间是相邻的。段是数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。 当我们创建数据表、索引的时候,就会相应创建对应的段,比如创建一张表时会创建一个表段,创建一个索引时会创建一个索引段。
- 表空间(Tablespace)是一个逻辑容器,表空间存储的对象是段,在一个表空间中可以有一个或多个段,但是一个段只能属于一个表空间。数据库由一个或多个表空间组成,表空间从管理上可以划分为系统表空间,撤销表空间,临时表空间等。
ps: - 如果采用系统表空间模式的,数据信息和索引信息都存储在ibdata1中,
- 如果采用独立表空间存储模式,data\数据库名 中还会产生 b.ibd文件(存储数据信息和索引信息)
文章来源: feige.blog.csdn.net,作者:码农飞哥,版权归原作者所有,如需转载,请联系作者。
原文链接:feige.blog.csdn.net/article/details/126448140
- 点赞
- 收藏
- 关注作者
评论(0)