主要接口协议
1. HTTP/HTTPS 接口
基本用法
# 查询数据
curl -X POST 'http://localhost:8123/' \
-H 'Content-Type: text/plain' \
-d 'SELECT * FROM system.tables LIMIT 5'
# 插入数据
curl -X POST 'http://localhost:8123/?query=INSERT%20INTO%20test%20FORMAT%20CSV' \
-H 'Content-Type: text/plain' \
--data-binary @data.csv
支持的参数
query
: SQL 查询语句database
: 默认数据库user
: 用户名password
: 密码format
: 输出格式(JSON、CSV、TabSeparated 等)compress
: 启用压缩decompress
: 启用解压缩
响应格式
- 支持多种输出格式:JSON、CSV、TabSeparated、Parquet、Arrow 等
- 可通过
FORMAT
子句或format
参数指定
2. TCP 原生协议
连接建立
// C++ 客户端示例
#include <Client/Connection.h>
DB::Connection connection("localhost", 9000, "default", "user", "password");
connection.connect();
协议特点
- 二进制协议,性能更高
- 支持压缩传输
- 支持异步查询
- 支持查询进度回调
3. MySQL 协议兼容
连接方式
mysql -h localhost -P 9004 -u default -p
支持的功能
- 基本的 SELECT、INSERT、UPDATE、DELETE 操作
- 支持 MySQL 客户端工具
- 兼容大部分 MySQL 驱动
限制
- 不支持所有 MySQL 特性
- 某些数据类型映射可能不完全一致
4. PostgreSQL 协议兼容
连接方式
psql -h localhost -p 9005 -U default -d default
支持的功能
- 基本的 SQL 操作
- 支持 PostgreSQL 客户端工具
- 兼容 PostgreSQL 驱动
5. gRPC 接口
服务定义
service ClickHouse {
rpc ExecuteQuery(QueryRequest) returns (stream QueryResponse);
rpc ExecuteQueryWithStreamInput(stream QueryRequest) returns (stream QueryResponse);
}
使用场景
- 高性能应用集成
- 流式数据处理
- 微服务架构
数据格式支持
输入格式
- CSV: 逗号分隔值
- TSV: 制表符分隔值
- JSON: JSON 格式
- JSONEachRow: 每行一个 JSON 对象
- Parquet: Apache Parquet 格式
- Arrow: Apache Arrow 格式
- Avro: Apache Avro 格式
- ORC: Apache ORC 格式
- Native: ClickHouse 原生二进制格式
输出格式
- TabSeparated: 制表符分隔(默认)
- CSV: 逗号分隔值
- JSON: JSON 格式
- JSONCompact: 紧凑 JSON 格式
- XML: XML 格式
- HTML: HTML 表格格式
- Vertical: 垂直格式(适合宽表)
- Pretty: 美化的表格格式
认证与安全
用户认证
-- 创建用户
CREATE USER 'username' IDENTIFIED BY 'password';
-- 授权
GRANT SELECT ON database.* TO 'username';
-- 设置配额
CREATE QUOTA 'user_quota' FOR INTERVAL 1 HOUR MAX QUERIES 1000 TO 'username';
访问控制
- 基于角色的访问控制 (RBAC)
- 行级安全策略
- 列级权限控制
- IP 地址限制
SSL/TLS 支持
<!-- config.xml -->
<https_port>8443</https_port>
<tcp_port_secure>9440</tcp_port_secure>
<openSSL>
<server>
<certificateFile>/path/to/server.crt</certificateFile>
<privateKeyFile>/path/to/server.key</privateKeyFile>
</server>
</openSSL>
查询语言特性
DDL 操作
-- 创建数据库
CREATE DATABASE test_db;
-- 创建表
CREATE TABLE test_db.events (
date Date,
user_id UInt32,
event_type String,
value Float64
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (user_id, date);
-- 修改表结构
ALTER TABLE test_db.events ADD COLUMN new_field String;
DML 操作
-- 插入数据
INSERT INTO test_db.events VALUES
('2023-01-01', 1001, 'click', 1.5),
('2023-01-01', 1002, 'view', 2.0);
-- 查询数据
SELECT
event_type,
count() as cnt,
avg(value) as avg_value
FROM test_db.events
WHERE date >= '2023-01-01'
GROUP BY event_type
ORDER BY cnt DESC;
-- 更新数据(轻量级更新)
ALTER TABLE test_db.events UPDATE value = value * 2 WHERE event_type = 'click';
-- 删除数据
ALTER TABLE test_db.events DELETE WHERE date < '2023-01-01';
高级查询特性
-- 窗口函数
SELECT
user_id,
event_type,
value,
row_number() OVER (PARTITION BY user_id ORDER BY date) as rn
FROM test_db.events;
-- 数组操作
SELECT
groupArray(event_type) as events,
arrayJoin(events) as event
FROM test_db.events
GROUP BY user_id;
-- 近似查询
SELECT
uniq(user_id) as unique_users,
quantile(0.95)(value) as p95_value
FROM test_db.events;
存储引擎
MergeTree 系列
-- 基础 MergeTree
CREATE TABLE basic_table (
date Date,
id UInt32,
data String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY id;
-- ReplicatedMergeTree(复制表)
CREATE TABLE replicated_table (
date Date,
id UInt32,
data String
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/shard1/replicated_table', 'replica1')
PARTITION BY toYYYYMM(date)
ORDER BY id;
-- SummingMergeTree(聚合表)
CREATE TABLE summing_table (
date Date,
key String,
value UInt64
) ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, key);
特殊引擎
-- Memory 引擎(内存表)
CREATE TABLE memory_table (
id UInt32,
data String
) ENGINE = Memory();
-- Distributed 引擎(分布式表)
CREATE TABLE distributed_table (
date Date,
id UInt32,
data String
) ENGINE = Distributed(cluster_name, database_name, table_name, rand());
-- MaterializedView(物化视图)
CREATE MATERIALIZED VIEW mv_table
ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, key)
AS SELECT
date,
event_type as key,
count() as value
FROM test_db.events
GROUP BY date, event_type;
集群配置
集群定义
<!-- config.xml -->
<remote_servers>
<test_cluster>
<shard>
<replica>
<host>node1</host>
<port>9000</port>
</replica>
<replica>
<host>node2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>node3</host>
<port>9000</port>
</replica>
<replica>
<host>node4</host>
<port>9000</port>
</replica>
</shard>
</test_cluster>
</remote_servers>
分布式查询
-- 查询分布式表
SELECT * FROM distributed_table WHERE date = '2023-01-01';
-- 跨集群查询
SELECT * FROM cluster('test_cluster', database.table) WHERE condition;
-- 集群函数
SELECT * FROM clusterAllReplicas('test_cluster', database.table);
监控与运维
系统表
-- 查看正在运行的查询
SELECT * FROM system.processes;
-- 查看表信息
SELECT * FROM system.tables WHERE database = 'test_db';
-- 查看集群状态
SELECT * FROM system.clusters;
-- 查看复制状态
SELECT * FROM system.replicas;
-- 查看分区信息
SELECT * FROM system.parts WHERE table = 'events';
性能监控
-- 查询统计
SELECT * FROM system.query_log WHERE type = 'QueryFinish' ORDER BY event_time DESC LIMIT 10;
-- 指标监控
SELECT * FROM system.metrics;
SELECT * FROM system.events;
SELECT * FROM system.asynchronous_metrics;
配置管理
<!-- config.xml 主要配置项 -->
<yandex>
<logger>
<level>information</level>
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
</logger>
<http_port>8123</http_port>
<tcp_port>9000</tcp_port>
<max_connections>4096</max_connections>
<max_concurrent_queries>100</max_concurrent_queries>
<path>/var/lib/clickhouse/</path>
<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
<users_config>users.xml</users_config>
</yandex>
最佳实践
表设计
- 选择合适的主键: 影响查询性能和存储效率
- 合理分区: 按时间或其他维度分区,便于数据管理
- 使用合适的数据类型: 选择最小的数据类型以节省存储空间
- 考虑压缩: 使用合适的压缩算法
查询优化
- 使用 PREWHERE: 在 WHERE 之前过滤数据
- **避免 SELECT ***: 只选择需要的列
- 合理使用索引: 创建跳数索引和布隆过滤器
- 批量操作: 避免频繁的小批量插入
运维建议
- 监控资源使用: CPU、内存、磁盘 I/O
- 定期备份: 使用 BACKUP/RESTORE 或文件系统快照
- 版本管理: 保持集群版本一致
- 容量规划: 预估数据增长和查询负载
这个接口详细说明文档涵盖了 ClickHouse 的主要接口协议、数据格式、认证安全、查询语言特性、存储引擎、集群配置、监控运维等方面的内容,为开发者和运维人员提供了全面的参考。