页大小——数据库文件IO的基本单位

除redis等内存数据库外,几乎所有的数据库都是将数据以文件的形式存储在磁盘、SSD硬盘等存储介质里的。目前绝大部分数据库系统的存储介质都是磁盘,磁盘的读写都是以扇区为单位,每一个扇区的大小是512字节,硬件的特点决定了操作系统、数据库系统等程序的最小文件IO单位是512字节。为了文件读写的效率,数据库系统不直接使用512B的最小粒度,而是采用更大的页来作为文件IO的基本单位,PostgreSQL的页大小默认是8K。

页大小太小或太大都会影响数据库的性能。如果页大小过小,由于逻辑上连续的数据表在物理存储层不一定连续,而是会被分割成多个页单独存储,磁盘的寻道时间与实际读写时间的比例会大大增加,影响读写效率。此外每一个页内除了数据本身还有页头等额外数据,页大小太小会造成数据本身之外的额外数据变大,从而占用更多的磁盘空间。如果页大小太大,存储、读写极少量数据时也会使用一个较大的基本单位,造成磁盘空间的浪费和读写效率的降低。更小的页大小也意味着更小的内存块,从而导致内存管理的开销变大,如更频繁的页面置换。

数据库系统的页大小和大部分操作系统的内存页大小(一般为4K或8K)相匹配,方便与操作系统内核以及文件系统的接口进行交互。但设计数据库系统时并不需要过多考虑操作系统的段页式等内存管理方式,因为早期操作系统的存储管理还不够成熟,数据库系统的设计者并不愿意相信操作系统提供的各种资源管理方式,为了提升数据库的性能和便于自己管理访存方式,PostgreSQL等数据库系统都会实现自己的内存、外存管理。虽然数据库系统运行在操作系统上,但准确来讲这两者应该是同级的关系。

Database Systems and Operating Systems are not friends!

Last Updated:
Contributors: yuesong-feng