> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> ClickHouse® 是一款用于联机分析处理（OLAP）的列式 SQL 数据库管理系统（DBMS），既提供开源软件，也提供云服务。

# 什么是 ClickHouse？

export const Image = ({img, alt, size}) => {
  return <Frame>
      <img src={img} alt={alt} />
    </Frame>;
};

ClickHouse® 是一款高性能的列式 SQL 数据库管理系统 (DBMS) ，用于联机分析处理 (OLAP) 。它既提供[开源软件](https://github.com/ClickHouse/ClickHouse)，也提供[云服务](https://clickhouse.com/cloud)。

<div id="what-are-analytics">
  ## 什么是分析？
</div>

分析，也称为 OLAP (Online Analytical Processing) ，是指针对海量数据集执行包含复杂计算 (例如聚合、字符串处理和算术运算) 的 SQL 查询。

不同于事务型查询 (即 OLTP，Online Transaction Processing) 每次查询只读写少量行，因此通常可在毫秒内完成，分析查询通常要处理数十亿甚至数万亿行。

在许多使用场景中，[分析查询必须是“实时”的](https://clickhouse.com/engineering-resources/what-is-real-time-analytics)，也就是说，必须在 1 秒内返回结果。

<div id="row-oriented-vs-column-oriented-storage">
  ## 行式存储与列式存储
</div>

只有采用正确的数据“排列方式”，才能实现如此高的性能。

数据库存储数据时，要么采用[行式存储，要么采用列式存储](https://clickhouse.com/engineering-resources/what-is-columnar-database)。

在行式数据库中，表中连续的行会依次顺序存储。这种布局能够快速检索行数据，因为每一行的各列值都存放在一起。

ClickHouse 是列式数据库。在这类系统中，表按列的集合作为存储单位，也就是说，每一列的值都会依次顺序存储。这种布局会让还原单独的行变得更困难 (因为同一行的各个值之间现在存在空缺) ，但按列执行的操作 (如过滤和聚合) 会比在行式数据库中快得多。

这种差异最适合通过一个示例查询来说明。下面的查询运行在 1 亿行[真实匿名网站分析数据](/zh/get-started/sample-datasets/anon-web-analytics-metrica)之上：

```sql theme={null}
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 中运行此查询](https://sql.clickhouse.com?query=U0VMRUNUIE1vYmlsZVBob25lTW9kZWwsIENPVU5UKCkgQVMgYyAKRlJPTSBtZXRyaWNhLmhpdHMgCldIRVJFIAogICAgICBSZWdpb25JRCA9IDIyOSAKICBBTkQgRXZlbnREYXRlID49ICcyMDEzLTA3LTAxJyAKICBBTkQgRXZlbnREYXRlIDw9ICcyMDEzLTA3LTMxJyAKICBBTkQgTW9iaWxlUGhvbmUgIT0gMCAKICBBTkQgTW9iaWxlUGhvbmVNb2RlbCBub3QgaW4gWycnLCAnaVBhZCddIApHUk9VUCBCWSBNb2JpbGVQaG9uZU1vZGVsCk9SREVSIEJZIGMgREVTQyAKTElNSVQgODs\&chart=eyJ0eXBlIjoicGllIiwiY29uZmlnIjp7InhheGlzIjoiTW9iaWxlUGhvbmVNb2RlbCIsInlheGlzIjoiYyJ9fQ\&run_query=true)，该查询仅从[现有 100 多个列中](https://sql.clickhouse.com/?query=U0VMRUNUIG5hbWUKRlJPTSBzeXN0ZW0uY29sdW1ucwpXSEVSRSBkYXRhYmFzZSA9ICdtZXRyaWNhJyBBTkQgdGFibGUgPSAnaGl0cyc7\&tab=results\&run_query=true)选择并过滤少数几个列，并在几毫秒内返回结果：

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/ddNWBC5mE_w-syUp/images/column-oriented-example-query.png?fit=max&auto=format&n=ddNWBC5mE_w-syUp&q=85&s=bbf9f7b529c87ddb42e9bfe1e0b05a2b" alt="列式数据库中的示例查询" size="lg" width="2496" height="1080" data-path="images/column-oriented-example-query.png" />

如上图中的统计信息所示，该查询在 92 毫秒内处理了 1 亿行，吞吐量约为每秒超过 10 亿行，或每秒传输略低于 7 GB 的数据。

**行式 DBMS**

在行式数据库中，尽管上述查询只涉及现有列中的少数几个列，系统仍然需要将其他列的数据从磁盘加载到内存中。原因在于，磁盘上的数据以称为[块](https://en.wikipedia.org/wiki/Block_\(data_storage\))的单位存储 (通常为固定大小，例如 4 KB 或 8 KB) 。块是数据从磁盘读取到内存时的最小单位。当应用程序或数据库请求数据时，操作系统的磁盘 I/O 子系统会从磁盘读取所需的块。即使只需要某个块中的一部分，也必须将整个块读入内存 (这是由磁盘和文件系统的设计决定的) ：

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/0xkAyEEn8ANRFZGQ/images/row-oriented.gif?s=65d32283890f54b87398e0bddf1a0ec3" alt="行式数据库结构" size="lg" width="630" height="258" data-path="images/row-oriented.gif" />

**列式 DBMS**

由于每一列的值都按顺序连续存储在磁盘上，因此运行上述查询时不会加载任何不必要的数据。
由于按块存储以及从磁盘到内存的传输方式与分析型查询的数据访问模式相契合，查询时只需从磁盘读取所需的列，从而避免对未使用数据进行不必要的 I/O。与按行存储相比，这种方式[快得多](https://benchmark.clickhouse.com/)，因为后者需要读取整行数据 (包括无关的列) ：

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/ddNWBC5mE_w-syUp/images/column-oriented.gif?s=43234d1f2e731088ce5e59de023a4d00" alt="列式数据库结构" size="lg" width="630" height="258" data-path="images/column-oriented.gif" />

<div id="data-replication-and-integrity">
  ## 数据复制与完整性
</div>

ClickHouse 使用异步多主复制机制，确保数据以冗余方式存储在多个节点上。数据写入任一可用副本后，其余副本都会在后台获取各自的副本。系统会保证各个副本上的数据保持一致。大多数故障都可自动恢复；在复杂情况下，也可实现半自动恢复。

<div id="role-based-access-control">
  ## 基于角色的访问控制
</div>

ClickHouse 使用 SQL 查询来管理用户账户，并支持配置基于角色的访问控制，这一点与 ANSI SQL 标准及常见的关系型数据库管理系统类似。

<div id="sql-support">
  ## SQL 支持
</div>

ClickHouse 支持一种[基于 SQL 的声明式查询语言](/zh/reference/home)，在很多场景下与 ANSI SQL 标准保持一致。支持的查询子句包括 [GROUP BY](/zh/reference/statements/select/group-by)、[ORDER BY](/zh/reference/statements/select/order-by)、[FROM](/zh/reference/statements/select/from) 中的子查询、[JOIN](/zh/reference/statements/select/join) 子句、[IN](/zh/reference/statements/in) 运算符、[窗口函数](/zh/reference/functions/window-functions) 以及标量子查询。

<div id="approximate-calculation">
  ## 近似计算
</div>

ClickHouse 提供了以精度换取性能的方法。例如，其部分聚合函数会以近似方式计算去重值计数、中位数和分位数。此外，还可以仅对部分数据样本运行查询，以快速得到近似结果。最后，聚合也可以只针对有限数量的键执行，而不是覆盖所有键。根据这些键的分布偏斜程度，这种方式能够在远少于精确计算所需资源的情况下，得到相当准确的结果。

<div id="adaptive-join-algorithms">
  ## 自适应 JOIN 算法
</div>

ClickHouse 会自适应地选择 JOIN 算法：先使用速度更快的哈希 JOIN；如果存在多个大表，则会退回到归并 JOIN。

<div id="superior-query-performance">
  ## 卓越的查询性能
</div>

ClickHouse 以极快的查询性能而闻名。
如需了解 ClickHouse 为什么这么快，请参阅[为什么 ClickHouse 如此之快？](/zh/get-started/about/why-clickhouse-is-so-fast)指南。
