You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何进行ClickHouse索引与分区分析及查询索引、分区使用情况?

嘿,我来帮你梳理下ClickHouse里关于索引、分区分析以及追踪查询用到的这些信息的实用方法,都是日常运维和查询调优里常用的技巧:

一、查看表的分区与索引基础信息

先从最基础的查看表本身的分区和索引配置开始:

1. 查看分区信息

  • system.parts系统表能拿到所有分区的详细状态,包括分区名、数据量、是否处于活跃状态等,非常适合做分区健康度分析:
SELECT partition, name, active, rows, 
       data_uncompressed_bytes / 1024 / 1024 AS uncompressed_size_mb
FROM system.parts
WHERE table = 'your_table_name' AND database = 'your_db_name'
ORDER BY partition;
  • 快速确认分区键的话,直接用SHOW CREATE TABLE看建表语句里的PARTITION BY部分就好:
SHOW CREATE TABLE your_db_name.your_table_name;

2. 查看索引信息

  • 同样,SHOW CREATE TABLE会清晰列出表的所有索引定义,包括主键、二级索引、跳数索引(Skip Index)等,一眼就能看懂索引结构。
  • 想要结构化的索引元数据,就查system.table_indices系统表:
SELECT name, type, expression, granularity
FROM system.table_indices
WHERE table = 'your_table_name' AND database = 'your_db_name';
二、追踪查询实际使用的索引与分区

这部分是你最关心的——知道查询到底用到了哪些索引和分区,才能针对性调优:

1. 用EXPLAIN分析查询计划

这是调试查询的核心工具,不同的选项能给出不同粒度的细节:

  • 基础EXPLAIN能看到分区裁剪的情况,比如哪些分区被过滤掉了:
EXPLAIN SELECT * FROM your_table_name WHERE date >= '2024-01-01';
  • 加上indexes=1参数,会明确显示查询用到的索引以及索引的命中逻辑:
EXPLAIN indexes=1 SELECT * FROM your_table_name WHERE date >= '2024-01-01' AND user_id = 123;
  • 如果想拿到实际执行的统计数据,用EXPLAIN ANALYZE(注意会实际执行查询,大表慎用),它会返回扫描的分区数、索引过滤的行数等真实指标:
EXPLAIN ANALYZE SELECT count(*) FROM your_table_name WHERE date BETWEEN '2024-01-01' AND '2024-01-31';

看输出时重点找Partition pruning(分区裁剪)和Using index(索引使用)相关的行,就能清楚知道哪些分区被跳过,哪些索引发挥了作用。

2. 用system.query_log追踪历史查询

如果要分析已经执行过的查询,先确保你的ClickHouse开启了查询日志(默认可能没开,需要在配置里调整),然后查system.query_log

SELECT query, partitions_scanned, partitions_total, indexes_used
FROM system.query_log
WHERE query LIKE '%your_table_name%' AND type = 'QueryFinish'
ORDER BY event_time DESC LIMIT 10;

这里的partitions_scanned是查询实际扫描的分区数,partitions_total是表的总分区数,indexes_used会直接列出查询用到的索引名称。

三、实用的分区调优小补充

最后给你两个常用的分区维护技巧:

  • OPTIMIZE TABLE合并小分区(适合MergeTree系列引擎),减少分区数量提升查询效率:
OPTIMIZE TABLE your_table_name PARTITION '2024-01' FINAL;
  • 清理过期分区节省存储空间:
ALTER TABLE your_table_name DROP PARTITION '2023-01';

这些方法应该能覆盖你日常分析索引和分区的需求,要是有特定场景的问题,随时再细化问~

内容的提问来源于stack exchange,提问作者bill

火山引擎 最新活动