什么是列式数据库?何时应该使用它?
作者:Charles Mahler / 产品, 用例
2023 年 1 月 4 日
导航至
如果您正在处理主要用于分析的大量数据,那么列式数据库可能是一个不错的选择。
在为您的应用程序选择数据库时,有很多不同的选项。一个常见的讨论似乎是高级 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 数据库都在云托管或需要广泛的安装过程的世界中。
为工作选择合适的工具
归根结底,技术决策取决于什么对您的用例有意义。选择数据库可能是构建应用程序以长期运行的最重要选择之一,因此了解所有可用的选项并选择最适合您的选项是有意义的。
如果您正在处理主要用于分析的大量数据,那么列式数据库可能是一个不错的选择。