关系数据库以行、列的二维表形式表示数据,按行以一维字符串的方式存储。列存储把一列中的数据值串在一起存储,一列一列地存储,列存储适用于批量数据的处理和即时查询。数据按列存储,每一列单独存放,数据即时索引,数据操作时只访问涉及的列,能够大量降低系统I/O,提高了数据并发处理能力。
1.列存储的概念
数据库中的数据模型给出了数据的表达方式,二维表是关系模型的数据结构,数据和数据之间的关系都在二维表中表示。行存储是每行以固定的大小进行存储,一行接一行;列存储是把一列中的数据值串在一起存储起来,然后存储下一列的数据,依次类推。
数据库中页是进行数据读取的基本单位,一次I/O操作读取一页,对应行存储是若干行的数据,对应列存储是一列的数据。海量数据分析中,列存储对列的查询分析可大量减少I/O操作,同一类型的列存储在一起可提高数据压缩比;大多数查询并不会涉及表中所有列,与压缩方法相结合,列存储方式可提升缓冲池的使用率。
列存储索引的局限性表现在列数限制(不能超过1024)和无法聚集两个方面。列存储不能提供的功能包括唯一索引、使用修改索引语句、用索引排序的ASC或DESC关键字、以索引的方式使用或保留统计信息、更新具有列存储索引的表等。列存储数据库在数据仓库、商务智能领域应用中具有如下优势:独特的存储方式可以迅速地执行复杂查询;其压缩技术为拥有海量数据的数据仓库、商务智能应用节约存储成本;列存储数据库先进的索引技术提高了数据库的管理水平。
列存储数据库大多结合了键值模式,具有如下特点:模式灵活,不需要预先设定模式,字段的增加、删除、修改方便;扩展能力强,有容错能力;适合大批量数据处理和即时查询;常用于联机事务型数据处理;由于列存储的每一列数据类型是同质的,不存在二义性问题,便于用来做数据解析,列存储的解析过程更有利于分析大数据。
2.列存储数据库
2006年《Big Table:适合于结构化数据的分布式存储系统》提出了列存储数据库的相关概念。列存储数据库的存储是以表的形式出现的,表由行键(Row Key)和至少一个列簇(Column Family)组成,采用行键作为行标识符,把相关的列分成组并构成列簇;列是列存储数据库的基本存储单元,列有名称和值,某些列存储数据库里还会给列赋予时间戳(Timestamp);时间戳用来管理列值的各个版本,新值插入时有新的时间戳,应用程序通过时间戳判断最新版本;列中的值是根据列簇标识符、列名和时间戳来索引的。列簇存储是指把相关的列构成的列簇存储在一个数据页上。列簇中的列是可变的,空值不用存储,在表定义中只定义列簇,根据应用的需要来设置列簇中的列,扩展能力强;列簇存储适合大批量的稀疏数据的处理,能在海量数据分析中节省大量的I/O操作,数据压缩比高;相关的列信息放在一个列簇中,与压缩方法相结合,可提升缓冲池的使用率。
以列存储数据库谷歌Big Table为例,开发者可以动态地控制列簇中的各列,数据值是按照行标识符、列名及时间戳来定位的,建模者和开发者可以控制数据的存储位置,读取操作和写入操作都是原子操作,数据行是以某种顺序来维护的。例如客户资料表,行由行标识符ID,以及客户信息(姓名、信用积分)和地址(街道、城市、省、邮政编码)两个列簇组成,添加信息时每个列都可以有时间戳,表中的数据值会依照行标识符ID、列名及时间戳来定位。Big Table是谷歌自用的,不对外开放。