作者
荣翔
背景数据库技术发展迅速,由原来的关系型数据库到越来越丰富的非关系型数据库。如果按照存储形式分类,主要有:行式存储(Row-Based)、列式存储(Column-Based)、键值(key-value)存储、文档(doc)存储、图形(graph)存储、时序数据库等。我们常用的传统关系型数据库(MySQL、Oracle、PostgreSQL、DB2和SQLServer)都是采用行式存储,而最新兴起的分布式数据库很多采用列式存储,例如:Druid、Kudu、Clickhouse等。
本文将介绍行式存储、列式存储以及业务场景的选型和对比。
存储基础数据库按照存储介质,分为磁盘数据库和内存数据库。对于磁盘数据库,需要依赖于内置硬盘或外置集中式存储设备。首先我们介绍磁盘的存储原理。
1.1磁盘存储我们先介绍几个概念:
磁盘扇区(sector)
磁盘中每个磁道等分为若干弧段,这些弧段即称为扇区。磁盘的读写以扇区为基本单位。可以使用fdisk-l命令来查看服务器中磁盘扇区的大小,通常是bytes=0.5K。为什么是这么大,这是一个行业标准(近期也有4K的扇区磁盘)。扇区是磁盘的最小存储单元。
扇区是一个物理层面的概念,操作系统是不直接和扇区交互的,而是和磁盘块交互。
磁盘块(IOBlock)
操作系统将相邻的扇区组合在一起,形成一个块,对块进行管理,通常称为磁盘块(或磁盘簇)。可以使用stat/boot参看,一般一个磁盘块由2、4、8、16、64等个扇区组成,这是操作系统中的逻辑概念,所以可以调节。通常一个磁盘块为Bytes=4K,即8个连续扇区。
inode
操作系统中文件数据存储在磁盘块中,那么还需要有地方存储文件的元数据信息(文件的创建用户、时间信息、权限等),最重要的是文件数据所在的磁盘块地址信息。这就是inode数据。
文件存储在磁盘中,操作系统有一定规范:
每个磁盘块中只能存储一个文件
例如一个文件大小为5K,操作系统中每个磁盘块大小为4K,那么这个文件实际使用2个磁盘块进行落盘存储。
磁盘块是操作系统最小存储单位
例如例子中的5K文件,存储在两个磁盘块,那么读取这个文件需要进行两次I/O操作。
文件的元数据信息
每个文件的数据存储在磁盘块中,inode进行登记。如果一个磁盘块不够,会申请新的磁盘块,均在inode中登记。文件读取时候,顺序读取inode中磁盘块的数据,加载至内存中。
1.2内存存储同样对于内存,操作系统同样定义了逻辑读取的基本单位为:页(page)。页的大小为磁盘的
倍数,可以使用命令getconfPAGE_SIZE查看。通常和磁盘块大小一致为4K。
1.3数据库中的页类似磁盘和内存,数据库中同样有页(page)的概念,显然这也是一个逻辑的概念。数据库中的数据在磁盘上以文件的形式存储,数据库的存储引擎会以固定大小的page为单位组织文件,读写磁盘也以page为单位。不同数据库page大小有差异,比如:SQLite1KB,Oracle/DB24KB,SQLServer8KB,MySQL16KB。
对于mysql数据库一次读写page相当于内存的4个page,4个磁盘块。
行列存储原理磁盘数据库的内部组件组成是复杂的,我们只