ClickHouse 简介

什么是ClickHouse

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。

关于查询语言

查询语言必须是声明型的(SQL或MDX)

特性

  1. ClickHouse允许在运行时创建表和数据库、加载数据和运行查询,而无需重新配置或重启服务。
  2. 数据压缩
  3. 数据的磁盘存储-优化内存使用ClickHouse被设计用于工作在传统磁盘上的系统。
  4. 多核心并行处理
  5. 多服务器分布式处理
  6. 支持sqlClickHouse支持基于SQL的查询语言,该语言大部分情况下是与SQL标准兼容的。 支持的查询包括 GROUP BY,ORDER BY,IN,JOIN以及非相关子查询。 不支持窗口函数和相关子查询。
  7. 向量引擎数据不仅仅按列存储,同时还按向量(列的一部分)进行处理。
  8. 实时的数据更新ClickHouse支持在表中定义主键。数据存储在MergeTree中。

    数据可以持续不断高效的写入到表中,并且写入的过程中不会存在任何加锁的行为。

  9. 索引
  10. 适合在线查询在没有对数据做任何预处理的情况下以极低的延迟处理查询并将结果加载到用户的页面中。
  11. 支持近似计算允许牺牲数据精度的情况下对查询进行加速。
  12. 支持数据复制和数据完整性ClickHouse使用异步的多主复制技术.

    在一些复杂的情况下需要少量的手动恢复。

缺点

  1. 没有完整的事物支持
  2. 缺少高频率,低延迟的修改或删除已存在数据的能力。
  3. 稀疏索引使得ClickHouse不适合通过其键检索单行的点查询。

SQL 语法

  1. select
    SELECT [DISTINCT] expr_list
        [FROM [db.]table | (subquery) | table_function] [FINAL]
        [SAMPLE sample_coeff]
        [ARRAY JOIN ...]
        [GLOBAL] ANY|ALL INNER|LEFT JOIN (subquery)|table USING columns_list
        [PREWHERE expr]
        [WHERE expr]
        [GROUP BY expr_list] [WITH TOTALS]
        [HAVING expr]
        [ORDER BY expr_list]
        [LIMIT [n, ]m]
        [UNION ALL ...]
        [INTO OUTFILE filename]
        [FORMAT format]
        [LIMIT n BY columns]
    
    • Join:
    SELECT <expr_list>
    FROM <left_subquery>
    [GLOBAL] [ANY|ALL] INNER|LEFT|RIGHT|FULL|CROSS [OUTER] JOIN <right_subquery>
    (ON <expr_list>)|(USING <column_list>) ...
    
    • LIMIT N BY 子句:
    SELECT
        domainWithoutWWW(URL) AS domain,
        domainWithoutWWW(REFERRER_URL) AS referrer,
        device_type,
        count() cnt
    FROM hits
    GROUP BY domain, referrer, device_type
    ORDER BY cnt DESC
    LIMIT 5 BY domain, device_type
    LIMIT 100
    
    • UNION ALL 子句
      SELECT CounterID, 1 AS table, toInt64(count()) AS c
          FROM test.hits
          GROUP BY CounterID
      
      UNION ALL
      
      SELECT CounterID, 2 AS table, sum(Sign) AS c
          FROM test.visits
          GROUP BY CounterID
          HAVING c > 0
      
    • in
      SELECT UserID IN (123, 456) FROM ...
      SELECT (CounterID, UserID) IN ((34, 123), (101500, 456)) FROM ...
      
    • 注意不同于MySQL, GROUP BYORDER BY子句不支持使用列的位置信息作为参数,但这实际上是符合SQL标准的。

       

  2. Insert into 
    INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
    

    Insert into select :

    INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
    

     

  3. create
    • 创建数据库:
    CREATE DATABASE [IF NOT EXISTS] db_name
    
    • 创建表:
    CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
    (
        name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
        name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
        ...
    ) ENGINE = engine
    
    • 临时表:
    CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name [ON CLUSTER cluster]
    (
        name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
        name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
        ...
    )
    
    • 视图
      CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name] [ENGINE = engine] [POPULATE] AS SELECT ...
      
  4. alter
    • 调整表结构
      ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...
      
    • 添加列
      ADD COLUMN name [type] [default_expr] [AFTER name_after]
      
    • 删除分区
    • ALTER TABLE table_name DROP PARTITION partition_expr
      
    • 连接分区| 单元(PARTITION|PART)
    • ALTER TABLE table_name ATTACH PARTITION|PART partition_expr
      
    • 替换分区
      ALTER TABLE table2_name REPLACE PARTITION partition_expr FROM table1_name
      
    • 在分区中清除列
      ALTER TABLE table_name CLEAR COLUMN column_name IN PARTITION partition_expr
      
    • 冻结分区
      ALTER TABLE table_name FREEZE [PARTITION partition_expr]

发表评论

电子邮件地址不会被公开。 必填项已用*标注