7 扩展话题
7.1 列存储
在本篇文章中,数据的存储格式,从数据页(buf页)到元组(tuple)到列信息的组织方式(微对象),历经一个从大到小的变迁。从物理存储的角度看,存储数据的基本单位是页(8k);从逻辑存储的角度看,存储数据的基本单位,是元组,即PG存储方式,还是行存储。
与行存储相对的一个方式,是列存储。
所谓列存储,对于一个二维表来讲,不再是以二维表的行为基本存储单位,而是以二维表的列为基本存储单位。这样,同一数据类型的数据就存储在了一起,一次读出的,是一个列的一部分信息。这有点像垂直分区的概念,但实现上,可能有很大不同。
7.2 分区
数据存储,如果可以分块,则可以减少IO,有效提高效率。
分区,包括水平分区和垂直分区,还有水平和垂直的组合分区。
分区的概念,是化整为零的思维方式,是把大表分解为小表;水平分区,是在表上横向分块,这样读子块可以避免整个表读入,减少IO;垂直分区,是在表上纵向分块,减少所有列读入的情况。
7.3 数据压缩
PG中,TOAST方式,是一种数据压缩的处理方式。另外,如果普通数据要压缩,可能的思路有:
1. 在页面(buf)读写前,进行解压和压缩
2. 形成tuple时,可以考虑压缩
3. 在形成tuple前,先对每个列进行压缩;也可以区分列的类型,对不同类型提供不同的压缩方式
这是三种不同级别的压缩,粒度不同,但都可以实现。
7.4 数据加密
可加解密的地方,道理同数据压缩。
7.5 存储设备
为了提高性能,更换存储设备,也是一个思考方向。使用盘阵、固态硬盘、flash盘等。
7.6 裸设备
裸设备,又名裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备。由应用程序负责对它进行读写操作,不经过操作系统的文件系统的缓冲。这种设备少了操作系统这一层,I/O效率更高。
对数据库系统提高IO效率有效。
可参考:
http://www.chinaunix.net/jh/19/272188.html
7.7 操作系统层调用
对于操作系统库函数调用、操作系统的一些设置方式,也会决定着数据库系统的存储效率。
可以参见: Linux关及性能的相关内核参数(一)