行式存储
在关系数据库中,数据以行和列的方式组织数据。关系数据库最显著的特点就是SQL(结构化查询语言)和事务处理(ACID),典型的代表有MySQL,Oracle,DB2等。在关系数据库中,一行数据代表数据模型的一种实例,数据与数据之间的关系通过外键等进行关联,因此非常适合存储关系型的数据,而数据在存储设备上一般按照行来组织。
在处理事务时,事务的ACID属性要求对数据的原子化操作,因为按行存储,一行记录的数据在存储设备上时紧挨着的,因此也就方便进行加锁(如果支持行级锁的话)。
从储存结构的特点可以看出,关系数据库在处理一条数据的全部信息(一行的所有列数据)非常方便,读取也非常快速。但在查询的时候,由于需要跳到多条记录进行查询,因此查询效率相对较低,尤其是在面对大数据量的复杂查询时候,会表现得有些力不从心。
列式存储
自从BigTable在海量数据存储和索引上取得显著效果之后,列式数据库开始取得广泛关注,催生了诸如HBase等众多列式存储的数据库。
与行式存储不同,列式数据库在数据存储上,采取一列存在一起,也就是说,先存完一列数据,再存下一列。数据按列存储,同一列的数据类型相同,并且还有很多取值相近的值,在这个特点下就取得了一些显著优势:
首先,数据查询快。由于一列的数据存储在一起,在查询是能够快速定位和读取所需的数据。相比于关系型数据库需要读取多个行,明显加快了效率。尤其是在使用聚合、过滤、排序等场景时非常高效。这也将它指向了OLAP领域。
其次,便于数据压缩。同列数据类型相同,可以使用很多高效压缩算法进一步节约空间,也进一步让查询和读取更加高效。比如最为常见的游程编码(Run-Length Encoding,RLE)和字典编码(Dictionary Encoding)等方法。
第三,列式数据库一般支持向量化处理,这就可以在一次操作中处理多个值,这让它在大数据和人工智能时代具有非常光明的未来。
同时,按列存储,也会带来一些不便:
首先,在数据的插入、删除、更新等,列式存储需要修改更多的位置。
其次,由于前一条的限制,事务的支持一般都不是很好。
第三,由于每一列都要单独的去在存储设备上找位置,查询多个列的效率不高,而这正是行式存储的优势。
键值存储
顾名思义,键值存储就是基于键值对的结构来存储数据,“键”是唯一的标识符,“值”可以是简单的数据项或更复杂的数据结构。键值存储的主要优势在于其高速读写性能和出色的可扩展性,这使得它们非常适合处理大量的并发请求。典型的代表就是Redis、Memchached等众多用于缓存的中间件。
键值存储只关注键的添加、查询、修改和删除,无需复杂的查询语言。使用非常简单和灵活。但同时,基于键,灵活性相对也存在不足。
其它
除此之外,还有很多其它类型的存储,比如针对时序的时序数据库、专注处理高维度数值向量的向量数据库、处理图连接的图数据库,以及文档数据库(如搜索构建)等。
如何选择
每种存储都有解决的独特问题,也有自己的软肋,因此要充分结合自身的业务场景进行分析,从而做出最合适的选择。
DB-Engines Ranking是DBMS流行度的排名,截止2024年12月排名如下: