数据库的存储结构——页

165 阅读3分钟

索引结构给我们提供了高效的索引方式,索引信息以及数据记录都是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的存储引擎负责对表中数据的进行读取和写入。不同存储引擎中存放数据的格式一般是不同的,甚至有的存储引擎比如Memory都不用磁盘来存储数据。

页的概述

数据库读写磁盘的基本单位是页(Page),数据库,无论是读一行,还是读取多行,都是将这些行所在的页进行加载。

因为记录是按照行来存储的,但是数据库的读取并不以行为单位,否则一次I/O操作只能处理一行数据,效率会很低。

lnnoDB将数据划分为若干个页,InnoDB中页的大小默认为16KB。

以页作为磁盘和内存之间交互的基本单位,也就是一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB的内容刷新到磁盘中。

页结构

不同的页可以不在物理结构上相连,只要通过双向链表相关联即可,每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。

页的大小

不同的DBMS的页大小不同。在MySQL的InnoDB中,默认页大小是 16KB。

查看默认页大小:

show variables like '%innodb_page_size%';

在这里插入图片描述

SQL Server中页的大小为 8KB,而在Oracle中我们用术语“块”(Block)来代表“页”,Oralce支持的块大小为 2KB,4KB,8KB,16KB,32KB 和 64KB。

页的上层结构

在数据库存储结构中,还存在表空间(tablespace),段(segment),区(extent),行(row)的概念

img

区(Extent)是比页大一级的存储结构,在InnoDB存储引擎中,一个区会分配64 个连续的页。因为InnoDB中的页大小默认是16KB,所以一个区的大小是64*16KB= 1MB。

段(Segment)由一个或多个区组成,区在文件系统是一个连续分配的空间(在InnoDB中是连续的64个页),不过在段中不要求区与区之间是相邻的。段是数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。当我们创建数据表、索引的时候,就会相应创建对应的段,比如创建一张表时会创建一个表段,创建一个索引时会创建一个索引段。

表空间(Tablespace)是一个逻辑容器,表空间存储的对象是段,在一个表空间中可以有一个或多个段,但是一个段只能属于一个表空间。数据库由一个或多个表空间组成,表空间从管理上可以划分为系统表空间、用户表空间、撤销表空间、临时表空间等。