ClickHouse 知识点

单条查询就能利用整机的CPU处理(不适合高qps的查询业务)

不适合关联查询

引擎:

  • TinyLog:列文件,保存在磁盘,不支持索引,没有并发控制
  • Memory:保存在内存中,不支持索引,读写不会阻塞
  • MergeTree:
    • 主键不唯一,可重复,没有唯一约束
    • 分区时按文件来区分
    • 分区内排序
    • 建表时 order by 必填【必填原因:稀疏索引,必须要有序,有序效率高】(主键必须是order by的前缀)
    • 以列文件+索引文件+表定义文件
    • 分区并行
    • TTL:设置表或者列的生命周期
  • ReplacingMergeTree:
    • 去重功能
    • (去重只会在同批插入或合并的过程中才生效)最终一致性
    • 分区内去重
    • 重复数据保留版本字段最大的,插入先后顺序

文件目录

  • columns.txt :列信息
  • primary.idx:稀疏索引(数据量小,二分查找,跳表)【index granularity,索引粒度】
  • data.bin :数据文件
  • data.mrk:标记文件,标记偏移量

关键参数

  • background_pool_size:后台线程池大小,merge线程就是在该线程池中执行(cpu2倍)
  • background_schedule_pool_size:执行后台任务的线程数(cpu2倍)
  • background_distributed_schedule_pool_size:分布式发送执行后台任务的线程数(cpu2倍)
  • max_concurrent_queries:最大并发处理请求数
  • max_threads:单个查询所能使用的最大cpu个数(cpu核数)
  • max_memory_usage:单次查询占用内存最大值
  • max_bytes_before_external_group_by:当group使用内存超过阈值后会刷新到磁盘进行
  • max_bytes_before_external_sort:当order by使用内存超过阈值后会刷新到磁盘进行

clickhouse不支持多数据目录,为了提升数据io性能,可以挂载虚拟券组 

查询优化

  • 使用count时,尽量可以不指定具体字段,直接去count.xml中获取条数
  • 去除查询中的重复字段
  • 使用prewhere代替where(prewhere会读取指定的列数据,来判断数据过滤,等待数据过滤之后再读取select声明的列字段来补全其余属性)
  • 使用主键字段
  • select 查询的列字段和where字段相同
  • order by要搭配where和limit使用
  • 避免产生虚拟列(select 表中没有的字段a+b)
  • 去重根据业务可以选择 uniqCombined函数,性能提升10倍以上,存在误差,每次查询结果不同
  • 查询熔断(设置单个查询的超时时间问题)
  • 关闭虚拟内存(物理内存和虚拟内存交换数据,导致查询变慢)
  • 表中不配置null值(单独存文件,不能够被索引,效率低)
  • 批量写入时先排序(无需的数据或者涉及的分区太多,导致clickhouse无法及时对新导入的数据进行合并,从而影响查询性能
  • join时小表在右(会把join的表加载到内存)

你可能感兴趣的:(clickhouse)