什么是列数据库?何时应该使用它?
作者:Charles Mahler / 产品,用例
2023年1月4日
导航至
如果您正在处理大量数据,主要用于分析,那么列数据库可能是一个不错的选择。
在选择数据库时有很多不同的选项。常见的讨论似乎是在SQL数据库和NoSQL数据库之间进行高级别SQL对NoSQL的争论,即数据应该存储在关系数据库中,还是存储在NoSQL的键值数据库、文档数据库或图形数据库等替代方案中。
另一种选择是完全转变方向,选择列数据库。在本文中,您将了解为什么做出这种选择是有意义的,以及列数据库的一些优势和劣势。
什么是列数据库?
正如其名所示,列(或列式)数据库将数据组织到列中而不是行中存储在磁盘上。以物联网传感器为例,基于行的数据库会在磁盘上以这种方式存储数据
列数据库会将相同的数据组织得让每个列值在磁盘上按顺序存储在一起
列式数据库的主要优势是,由于改进的压缩率,它可以显著减少存储数据的磁盘空间。此外,列式数据库在处理分析型查询方面比传统的基于行的数据库要快得多。
为什么列数据库适合分析工作负载?
那么,改变数据存储格式如何具体地提高性能?有几个因素在起作用,导致列数据库能够为在线分析处理(OLAP)工作负载提供比传统数据库好几个数量级的性能。
第一个原因是改进的压缩。这是由于列数据库能够为每种数据类型使用最佳压缩算法,因为每一列都是相同类型的数据,而不是一行混合数据类型的数据。这不仅降低了磁盘上的存储成本,还提高了性能,因为需要更少的磁盘寻道,并且可以更多地将数据放入RAM。
列数据库提高性能的另一种方式是实际上在底层存储相同列的多个不同版本,这些版本被排序到不同的顺序中,以便为某些查询提供更快的过滤和选择。
列式数据库通过多种方式提高性能。以下是一些示例:
- 根据查询数据动态调整索引
- 向量处理
- 优化和高效的列连接
- 延迟列物化
这些优化的结果可以在以下可视化图表中看到,该图表展示了分析列式数据库性能的论文中进行的测试。基于TPC-H数据仓库基准数据集,列式数据库的性能比传统的行式数据库快约10倍。
图表显示了哪些优化对列式数据库的性能影响最大,在这种情况下,延迟物化提供了最大的性能提升。
列式数据库性能权衡
与计算机科学中的几乎所有事物一样,在列式数据库性能方面也做出了权衡。它们针对分析型工作负载进行了优化,并且按照设计,并不适合传统的关系型数据库所针对的在线事务处理(OLTP)工作负载。
在尝试更新特定数据点或写入单个数据点的情况下,性能损失最大。使用列式数据库时,尽可能以批量方式插入数据。
列式数据库在读取查询方面也会受到影响,当你像使用关系型数据库那样获取一行中的所有数据时。由于每个列都需要重建以创建整个行,因此性能会受到影响。
列式数据库的应用场景
列式数据库非常适合任何需要分析大量数据的情况。让我们看看一些常见的应用场景。
商业智能
列式数据库非常适合分析销售数据,因为它们允许你以各种方式划分信息。这可以帮助你发现你可能没有注意到的趋势和模式。例如,你可以使用列式数据库通过地区、品牌或产品类别比较不同产品的销售数据。
应用性能监控
应用性能监控是另一个常见场景,可以使用列式数据库来帮助提高软件的可靠性和性能。通过跟踪和分析应用程序的性能数据,可以在应用程序崩溃或变慢之前发现问题。这可以帮助你避免停机时间,并确保你的用户获得最佳体验。通过使用列式数据库,你可以存储更细粒度的数据以获得更深入的见解,同时由于出色的数据压缩而降低成本。
物联网
越来越多的物联网设备正在部署,其中许多设备正在收集用于分析型工作负载的数据。列式数据库可以用于存储这些数据,以便进行实时警报,并生成预测以提高多个行业的效率。
专用列式数据库示例
到目前为止,我们已从高层次上探讨了列式数据库及其优势。虽然所有列式数据库都广泛具有相同的特性,并且可以作为通用数据仓库或数据湖有效地使用,但在本节中,我们将探讨它们如何根据更具体的性能特性进行调整和优化。
InfluxDB IOx
InfluxDB IOx 是为 InfluxDB 优化的开源列式存储引擎,适用于处理时间序列数据。在性能方面,时间序列数据由于其用户想要以不同的方式查询数据,从而对数据库性能提出了独特的挑战。
- 仅需要少量数据的分析类型查询,例如获取过去一周传感器平均温度。
- 关系型查询,用户希望获取过去5分钟内来自许多不同传感器的所有可用信息。
时间序列数据通常以大量涌入,这需要快速摄取能力,以便快速索引和查询数据,以便进行实时监控和警报。此外,许多用户希望能够长期存储这些数据,以便进行历史分析和预测,而不会造成巨大的经济负担。
InfluxDB 通过管理数据生命周期并在热存储和冷存储之间移动数据,允许用户在历史数据上获得快速性能的同时,通过使用价格较低的存储来降低存储成本,这些存储未被积极查询。
实现这一目标的关键部分是通过构建和贡献类似 Apache Arrow、DataFusion 和 Parquet 的项目来完成的。Arrow 允许数据在内存中以列式格式保持压缩,并在数据库的不同部分之间移动。Parquet 用于高效持久存储,而 DataFusion 提供高性能查询和 SQL 支持。许多其他主要项目和供应商也在 Parquet 和 Arrow 上进行构建,这也使集成和兼容性更加广泛的大数据生态系统成为可能。
Apache Druid
Apache Druid 是一个具有底层列数据的实时数据库。Druid 可以处理类似典型数据仓库的工作负载,但更注重低延迟响应时间,常用于交互式用户界面等。
DuckDB
DuckDB 是一个进程内数据库,旨在用于 OLAP 工作负载,本质上是为分析设计的 SQLite。DuckDB 使用列式向量处理来以出色的性能运行 SQL 查询,并且可以轻松嵌入到应用程序中。DuckDB 的主要卖点在于它易于设置和本地运行,而在大多数 OLAP 数据库都需要云托管或需要复杂的安装过程的世界中,这一点尤为重要。
选择合适的工具
最终,技术决策归结为适合您用例的内容。选择数据库可能是构建长期应用程序时最重要的选择之一,因此了解所有可用的选项并选择最合适的一个是有意义的。
如果您正在处理大量数据,主要用于分析,那么列数据库可能是一个不错的选择。