| 排序键选择 | 把高频过滤、可控基数的列放前面,时间列通常放尾部参与排序 |
|---|---|
| 主键声明 | PRIMARY KEY 必须是 ORDER BY 的前缀;不写时等于 ORDER BY |
| 无法保证 | MergeTree 不保证行唯一,有序性也只在单个 part 内成立 |
示例
示例
-- 查询能利用排序键前缀裁剪
SELECT count() FROM metrics WHERE metric = 'cpu' AND ts >= now() - INTERVAL 1 HOUR;
-- 不命中前缀的过滤无法裁剪,只能扫描
SELECT count() FROM metrics WHERE value > 100;
-- 看主键与排序键定义
SELECT name, sorting_key, primary_key FROM system.tables WHERE table = 'metrics';用 EXPLAIN 或 system.query_log 里的 read_rows 对比实际扫描行数,能验证排序键是否用上。