什么是 ClickHouse?
ClickHouse® 是一个高性能、面向列的 SQL 数据库管理系统 (DBMS),用于在线分析处理 (OLAP)。它既可以作为 开源软件 使用,也可以作为 云服务 提供。
什么是分析?
分析,也称为 OLAP(在线分析处理),指的是对海量数据集进行复杂计算(例如,聚合、字符串处理、算术运算)的 SQL 查询。
与每次查询只读写少量行,因此在毫秒内完成的事务性查询(或 OLTP,在线事务处理)不同,分析查询通常处理数十亿和数万亿行。
在许多使用场景中,分析查询必须是“实时”的,即在一秒钟内返回结果。
面向行与面向列的存储
只有采用正确的数据“方向”才能实现这种性能水平。
数据库以面向行或面向列的方式存储数据。
在面向行的数据库中,连续的表行按顺序一个接一个地存储。这种布局允许快速检索行,因为每行的列值存储在一起。
ClickHouse 是一个面向列的数据库。在这样的系统中,表被存储为列的集合,即每列的值按顺序一个接一个地存储。这种布局使得恢复单行变得更加困难(因为现在行值之间存在间隙),但列操作(如过滤器或聚合)比面向行的数据库快得多。
这种差异最好用一个在 1 亿行真实世界匿名网络分析数据上运行的示例查询来解释
SELECT MobilePhoneModel, COUNT() AS c
FROM metrica.hits
WHERE
RegionID = 229
AND EventDate >= '2013-07-01'
AND EventDate <= '2013-07-31'
AND MobilePhone != 0
AND MobilePhoneModel not in ['', 'iPad']
GROUP BY MobilePhoneModel
ORDER BY c DESC
LIMIT 8;
在 ClickHouse SQL Playground 上运行此查询,它从 100 多个现有列中选择和过滤少数列,并在毫秒内返回结果
正如你在上面图表中的统计信息部分看到的那样,该查询在 92 毫秒内处理了 1 亿行,吞吐量约为每秒 3 亿行或略低于 7 GB。
面向行的 DBMS
在面向行的数据库中,即使上面的查询只处理现有列中的少数列,系统仍然需要从磁盘加载其他现有列的数据到内存中。原因是数据以称为块(通常是固定大小,例如 4 KB 或 8 KB)的块存储在磁盘上。块是从磁盘读取到内存的最小数据单位。当应用程序或数据库请求数据时,操作系统的磁盘 I/O 子系统从磁盘读取所需的块。即使只需要块的一部分,也会将整个块读入内存(这是由于磁盘和文件系统设计)。
面向列的 DBMS
由于每列的值在磁盘上一个接一个地顺序存储,因此在运行上述查询时不会加载不必要的数据。由于从磁盘到内存的块状存储和传输与分析查询的数据访问模式对齐,因此只从磁盘读取查询所需的列,从而避免了不必要地为未使用的数据进行 I/O。与基于行的存储(其中读取整个行(包括不相关的列))相比,这要快得多
数据复制和完整性
ClickHouse 使用异步多主复制方案来确保数据冗余地存储在多个节点上。在写入任何可用副本后,所有剩余副本都在后台检索其副本。系统在不同的副本上维护相同的数据。大多数故障后的恢复是自动执行的,或者在复杂情况下是半自动执行的。
基于角色的访问控制
ClickHouse 使用 SQL 查询实现用户帐户管理,并允许进行基于角色的访问控制配置,类似于 ANSI SQL 标准和流行的关系数据库管理系统中可以找到的配置。
SQL 支持
ClickHouse 支持基于 SQL 的声明性查询语言,在许多情况下,该语言与 ANSI SQL 标准相同。支持的查询子句包括 GROUP BY、ORDER BY、FROM 中的子查询、JOIN 子句、IN 运算符、窗口函数和标量子查询。
近似计算
ClickHouse 提供了用精度换取性能的方法。例如,它的一些聚合函数可以近似计算不同值的计数、中位数和分位数。此外,查询可以在数据样本上运行,以快速计算近似结果。最后,聚合可以针对有限数量的键而不是所有键运行。根据键的分布倾斜程度,这可以提供相当准确的结果,并且比精确计算使用的资源少得多。
自适应连接算法
ClickHouse 自适应地选择连接算法,它从快速哈希连接开始,如果有多张大型表,则回退到合并连接。
卓越的查询性能
ClickHouse 以其极快的查询性能而闻名。要了解 ClickHouse 如此之快的原因,请参阅《为什么 ClickHouse 如此之快?》指南。