CK数据读取底层逻辑(如下图所示)
1. 第一阶段,通过隐含的 granule 单位读取主键索引 idx 文件
2. 通过二分搜索过滤不需要的 granule,再关联对应的 mk2 文件,映射 Granule 和数据文件的 offset
3. 进入第二阶段,并发解压、读取 bin 数据文件,进一步排除数据,完成读取
# 开启查询执行详细日志
# /etc/clickhouse-server/config.xml
<logger>
<!-- 等级需为 trace -->
<level>trace</level>
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
<size>1000M</size>
<count>10</count>
</logger>
# 函数
1. USING 代替 on
2. prewhere 替代 where
3. uniqCombined 替代 distinct
4. 用 IN 代替 JOIN (较少场景适用)
5. count() 代替 count(*)
# 原则
1. 多表 join 时要满足小表在右的原则
2. 两张分布式表上的 IN 和 JOIN 之前必须加上 GLOBAL 关键字
3. 如果复合主键中的键列在基数上有很大差异,那么查询时将主键列按基数升序排列是有好处的
(性别基数是2)
4. 对于高基数列,主键排序顺序对于未命中主键的搜索性能的影响不大,接近全表扫描
# 方案
1. 当查询条件属于复合键(id,name)但不是第一个键列的列字段(name)&