Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入探索列式数据库:是什么让它们脱颖而出

深入探索列式数据库:是什么让它们脱颖而出

作者头像
云云众生s
发布于 2025-02-09 13:21:27
发布于 2025-02-09 13:21:27
21401
代码可运行
举报
文章被收录于专栏:云云众生s云云众生s
运行总次数:1
代码可运行

如果您是一名数据从业者,了解这些内部原理可以帮助您优化性能。

译自 Deep Dive into Columnar Databases: What Makes Them Shine,作者 Gaurav Ramesh。

列式存储已成为数据工程和分析领域的一个颠覆者。与传统的行式数据库相比,它提供了显著的性能优势。

以列存储数据的想法并不新鲜。它最早由 GP Copeland 和 SN Khoshafian 在 1985 年全面提出。他们的论文 A Decomposition Storage Model (DSM),” 提出以二元关系存储数据,将每个属性值与记录的标识符配对。这种方法按列而不是按行组织数据,为涉及属性子集的查询提供了简单性和检索性能优势。但是,它总体上需要更多的存储空间。

研究人员于 1999 年开始开发 MonetDB,并于 2004 年将其作为开源项目发布。它成为首批采用列式架构进行分析工作负载并展示其有效性的系统之一。在 2000 年代中期开发的 C-Store 标志着另一个重要的里程碑。它引入了先进的概念,这些概念现在已成为现代列式存储系统中的标准。

在 2000 年代后期和 2010 年代初期,该领域的发展加速,Apache Parquet 等项目(受 Google 的 Dremel 论文 的影响)将列式存储引入了 Hadoop 生态系统。

核心概念:列式存储与行式存储

传统的行式数据库将单个行的所有数据存储在一起。一行表示您要建模的实体。从这个角度来看,对于这篇文章,可以将面向文档的数据库(如 MongoDB) 视为行式数据库,因为它将整个文档(实体)存储在一起,类似于行式数据库。相比之下,列式数据存储将数据组织成列,每列包含所有行中单个属性的值。这种看似简单的更改对性能产生了深远的影响。

查询处理中的谓词和投影

在讨论事务和分析系统时,需要理解两个关键概念:

  • 谓词是您用来过滤所需实体(行)的条件(将它们视为 SQL 查询中的 WHERE 子句)。
  • 投影是您在响应中需要的字段(列)(将它们视为在 SELECT 语句中定义的名称)。

如果您将数据视为垂直堆叠的行列表,则谓词会水平切片,而投影会垂直切片。

事务查询通常依赖于谓词来过滤行,投影跨越整行(例如,SELECT * FROM orders WHERE user_id = 1234)。相比之下,分析查询中的投影涉及被查询实体的一小部分字段(例如,SELECT user_id, name, num_orders FROM user_aggregates WHERE user_id = 1234)。

考虑一个包含 50 列和数百万行的表。在行式系统中,如果您只需要三列,数据库仍然必须读取每行的所有 50 列。使用列式存储,仅访问三个相关的列,从而大大减少了 I/O 开销,即在分析中处理的数据量查询。

支持列式存储的关键技术

以列存储数据可以实现各种优化,从而显著提高查询性能。这是一个思维模型:将查询执行视为一个通过各个阶段传递数据的管道,并在每个步骤中对其进行转换。数据越小,成本越低,管道速度越快。

减少数据您可以使用多种方法:

  • 高效的数据表示(数据压缩,列式压缩)
  • 提前过滤数据(列裁剪,谓词下推)
  • 尽可能晚地扩展数据(直接对压缩数据进行操作,延迟物化)
  • 更快的数据处理(向量化执行,优化连接)

这些技术是相互关联的,并且相互依赖以获得最大的性能提升。

数据压缩和列式压缩

列式存储实现了高压缩率,因为单个列中的数据类型相同并且表现出相似的模式。诸如字典编码、运行长度编码 (RLE)、位打包和增量编码等技术通常用于现代列式存储中。

例如,在跟踪用户流量来源的 Web 分析数据库中,source列通常具有一小组唯一值。 这允许:

  • 字典编码:将整数值分配给字符串值(例如,email = 1,Twitter = 2)。
  • 运行长度编码 (RLE):如果连续条目具有相同的值,则将其存储为(值,计数)。
  • 位打包:如果只存在几个唯一值,则每个值使用较少的位而不是完整的整数。

列裁剪

列裁剪消除了查询执行中不必要的列。 考虑以下查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT first_name, last_name, email, phone FROM users WHERE num_orders > 10

如果表有 100 列,但查询只需要 5 列,则列裁剪可将 I/O 开销降低 95%。

谓词下推

谓词下推在查询执行管道中尽早地过滤数据。 通过使用区域图(跟踪存储块内最小值/最大值的元数据),数据库可以跳过不符合过滤条件的整个块。

例如,在查询中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT name FROM users WHERE age > 30 AND city = 'New York'

列式数据库可以首先根据元数据过滤块,然后再扫描单个行,从而减少不必要的处理。

直接对压缩数据进行操作

列式数据库可以直接对压缩数据执行操作,从而最大限度地降低 I/O 成本。 考虑以下查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT sum(salary) FROM employees WHERE department = 1002

使用字典编码和 RLE,只有相关数据在最后一步被读取和扩展,从而显着提高性能。

延迟物化

延迟物化会延迟加载不必要的列,直到需要时才加载。 在查询中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT name FROM users WHERE age > 30 AND city = 'New York'

最初只处理 age 和 city,name 列在最后阶段加载。

向量化处理

SIMD(单指令多数据)允许处理器并行地对多个值执行操作。 考虑:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT sum(price) FROM sales WHERE user_id = 1234

SIMD 不是逐行评估 user_id,而是一次比较 256 个值,从而显着提高速度。

高效的连接实现

列式数据库实现了高级连接技术,例如使用 Bloom 过滤器的半连接。 这些结构允许数据库有效地检查数据集中是否存在某个值,从而减少不必要的比较。

例如,在连接中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM orders o JOIN customers c ON o.customer_id = c.id WHERE c.region = 'EMEA'

为有效客户构建 Bloom 过滤器,允许数据库快速丢弃不相关的订单。

结论

列式数据存储提供:

  • 通过压缩实现存储效率
  • 通过列裁剪和谓词下推实现减少 I/O
  • 使用向量化处理和优化连接实现更快的执行速度

它们广泛用于 Web 分析、商业智能机器学习基础设施和实时分析。

如果您是数据从业者,了解这些内部原理可以帮助您优化性能。 如果您是工程负责人,这些技术将帮助您评估权衡并为您的组织做出战略决策。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-082,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
最强大的 CSS 布局 —— Grid 布局
Grid 布局即网格布局,是一种新的 CSS 布局模型,比较擅长将一个页面划分为几个主要区域,以及定义这些区域的大小、位置、层次等关系。号称是最强大的的 CSS 布局方案,是目前唯一一种 CSS 二维布局。利用 Grid 布局,我们可以轻松实现类似下图布局,演示地址[1]
GopalFeng
2020/09/24
16.3K0
最强大的 CSS 布局 —— Grid 布局
Grid网格布局入门
它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了。
javascript.shop
2019/09/04
2.3K1
Grid网格布局入门
【CSS】最强大的布局之grid布局精讲
轮播图swiper框架的基本使用 【Transform3D】转换详解(看完就会) 【css动画】移动的小车
坚毅的小解同志的前端社区
2022/11/28
3.1K0
【CSS】最强大的布局之grid布局精讲
【图片版】CSS网格布局(Grid)完全教程
CSS网格布局(Grid)是一套二维的页面布局系统,它的出现将完全颠覆页面布局的传统方式。传统的CSS页面布局 一直不够理想。包括table布局、浮动、定位及内联块等方式,从本质上都是Hack的方式,并且遗漏了一些重要的功能(比如:垂直居中)。Flexbox的出现部分解决了上述问题,但Flex布局是为了解决简单的一维布局,适用于页面局部布局。而Grid天然就是为了解决复杂的二维布局而出现的,适用页面的整体布局。在实际工作中,Grid和Flexbox不但不矛盾,而且还能很好的结合使用。做为WEB程序员,我们在页面布局问题上都付出过努力,也将不断探索新的方案。而Grid是第一个专门为布局问题而生的CSS模块,我们有理由对Grid充满期待。
毛瑞
2018/05/02
5.3K0
【图片版】CSS网格布局(Grid)完全教程
[译]二维布局:Grid Layout
CSS Grid Layout 是 CSS 中最强大的布局系统。不像 flexbox 那样的一维系统,它是一个二维系统,可以同时处理列和行。您可以通过将规则应用到父元素来使用 Grid Layout。
码农小余
2022/06/16
4.7K0
[译]二维布局:Grid Layout
CSS(七)
Grid 布局是 CSS 中最强大的布局系统。 Grid 布局是一个二维布局系统,意味着它可以处理列和行,不像 Flexbox 主要是一维布局系统。通过将 CSS 规则应用于父元素(称为 grid container)和子元素(称为 grid items),我们就可以使用网格布局。
1ess
2021/10/29
5430
CSS(七)
图解CSS布局(一)- Grid布局
Grid 布局是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局,也是唯一的二维布局方案,利用grid布局可以很轻松的实现很多的网页布局
小丞同学
2021/08/16
2.1K0
万字总结 CSS 布局
本文总结了主流的几种 CSS 的布局方法,无论你是一个想要学习 CSS 布局的新手,还是一个比较有经验但想要进一步巩固与了解最新CSS布局知识的前端开发者,这篇指南都能帮你全面了解如今CSS布局发展的现状。
用户8921923
2022/10/24
6.1K0
万字总结 CSS 布局
grid网格布局
​ 距今来看已经十多年了,确确实实占据了前端布局中很大的地位,相比大家对flex都很熟悉,所以今天我们的主角就是-------> Grid
Snine
2022/02/11
2.1K0
grid网格布局
Web前端学习 第2章 网页重构16 grid布局
grid容器的水平区域成为行(row),垂直区域成为列(column),行与列之间的较差与是单元格(cell),划分网格的线成为网格线(gird line),了解了这些基本概念之后,就可以开始用相应的css属性设置grid容器中的项目了。
学习猿地
2020/06/15
1K0
Web前端学习 第2章 网页重构16 grid布局
Grid布局详解:打造完美的网页布局
随着Web技术的不断发展,网页布局也在不断地改进和完善,其中Grid布局是最受欢迎的一种布局方式。它是一种基于网格线的布局方式,可以轻松地实现复杂的网页布局,而且还具有很强的可读性和可维护性。
Front_Yue
2023/12/22
1.7K0
Grid布局详解:打造完美的网页布局
CSS 中的 Grid 布局 完全指南
Grid 是一个基于二维网格布局的系统,有了它我们可以非常方便的实现过去很复杂布局,无需再使用float, inline-block, position 这些本质上是 hack 的方法。
羽月
2022/10/08
4.2K0
CSS 中的 Grid 布局 完全指南
10分钟理解CSS3 Grid
上一篇文章我们介绍了 css3 flexbox,今天我们再来说说css3的另外一个强大的功能:Grid。 Grid做前端的同学应该都很熟悉了,翻译成中文为“栅格”,用过bootstrap、semantic ui、ant design的同学肯定都了解grid layout(删格布局),以往css框架中的grid布局一般是通过float和百分比的宽度实现的,这种实现有几种缺点:
MudOnTire
2019/05/26
7910
CSS Flexbox与Grid:构建响应式布局的艺术
开启Flex布局模式。将一个元素设置为Flex容器,其直接子元素将成为Flex项目。
天涯学馆
2024/05/22
5370
CSS Flexbox与Grid:构建响应式布局的艺术
grid布局—让css变得更简单
通过将属性display的值设为grid,使 HTML 元素变为网格容器。在 CSS 网格中,父元素称为容器(container),它的子元素称为项(items)。
_kyle
2020/08/24
5.7K0
grid布局—让css变得更简单
grid 布局的使用
grid 布局的使用    css 网格布局,是一种二维布局系统。    浏览器支持情况:老旧浏览器不支持,    概念: 网格容器。元素应用dispalay:grid,它是所有网格项的父元素。       <div class="container">          <div class="item item-1"></div>         <div class="item item-2"></div>         <div class="item item-3"></div>       
用户1197315
2018/01/22
1.7K0
[CSS] 栅格化布局
栅格化布局帮助你更容易构建复杂的网页设计。它会将HTML元素转换为网格的容器(有行有列)。你可以在网格里面添加你想要的子元素。
Jimmy_is_jimmy
2020/10/29
1.3K0
CSS Grid 新手入门
另外,下面一段话摘自A Complete Guide to Grid,对于CSS Grid会有更加清楚地释义
糊糊糊糊糊了
2018/09/28
2.3K0
CSS Grid 新手入门
grid布局了解一下
首先,看一张图,了解一下容器和项目(不难理解,容器就是包在外层的元素,项目就是内部的元素)
用户4793865
2023/01/12
5200
grid布局了解一下
GRID布局
目前CSS布局方案中,网格布局可以算得上是最强大的布局方案了。它可以将网页分为一个个网格,然后利用这些网格组合做出各种各样的布局。Grid布局与Flex布局有一定的相似性,都可以指定容器内部多个成员的位置。不同之处在于,Flex布局是轴线布局,只能指定成员针对轴线的位置,可以看作是一维布局。Grid布局则是将容器划分成行和列,产生单元格,然后指定成员所在的单元格,可以看作是二维布局。
WindRunnerMax
2020/08/27
1.5K0
相关推荐
最强大的 CSS 布局 —— Grid 布局
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验