接上篇:https://developer.aliyun.com/article/1223108?spm=a2c6h.13148508.setting.32.44ec4f0eNvAByn
随着表的数据越来越多,文件尺寸超过1GB后,命名规则也会有所改变,会在原有名字后加上.1以示区别。
fsm(free space map)是空闲可用空间地图。比如有多个数据块,往表里插入数据时,需要明确哪个数据块里有空间可用于存放新插入的数据,PolarDB会先查看fsm文件。
vm是可见性地图,主要用于对表空间进行整理,帮助vacuum时提高效率。
数据文件的fork号为0,空闲空间映射的fork号为1,可见性地图的fork号为2。
PolarDB也支持自建表空间(目前仅在企业版PolarDB支持)。
创建新的表空间后,PGDATA下的pg.tblspc目录下存在与新建表空间名一致的目录。它是一个指针,指向创建表空间时的物理位置,数据存放于/home/postgres/tblspc上。
PolarDB默认有两个可用的表空间,pg_default和pg_global。默认情况下使用pg_default。
表数据文件内部被分为多个块,默认8k,每个块都有唯一ID。
上图右侧为数据块的结构。块头里面存放了控制性的信息,比如常见的行指针。存放数据时,顺序为从下往上存放,而块头的信息为从上往下存放,中间区域即可用空间。
一行数据插入到数据块中,首先,数据会进入块的底部,块头产生指针,指向行开始的位置。插入第二行数据,则会由下往上叠加,并在块头产生新的指针。
访问表的方式有两种:
• 顺序扫描:即全表扫描。比如有两个数据块,PolarDB在访问时会先找到第一个块的位置,并从第一行开始进行完整扫描;如果没有,则进入第二个块的第一行继续扫描,以此类推。
• 索引扫描:根据索引行里记录的rowID进行扫描,无需全表扫描。
启动PolarDB数据库时,会先启动实例,实例由进程和内存组成。postgres server process是PolarDB的父进程,所有后台进程、后端进程等都由父进程派生。backend process进程负责处理用户请求,background process用于管理整个数据库。
Backend process负责客户端请求。客户端访问数据库时,并不会直接与数据库交互,而是将所有请求发给Backend进程(相当于代理进程),由它再向server进程或后台进程发出请求。执行结果也由Backend进程返回给用户进程。
接下篇:https://developer.aliyun.com/article/1223106?groupCode=polardbforpg