ClickHouse中整型数据均为固定长度(可以设置长度参数,但是会被忽略),整型包括有符号整型和无符号整型。
有符号整型:Int8,Int16,Int32,Int64,Int128,Int256
无符号整型:UInt8,UInt16,UInt32,UInt64,UInt128,UInt256
String
FixedString(N)
固定字符串需要指定长度!
当数据长度刚好是N时,FixedString类型比较高效,其他情况下效率会降低。
注意:插入数据时,如果字符串长度小于N,则会对字符串尾部用空子节填充;如果长度大于N,会抛出Too large value for FixedString(N)异常。
UUID
通用唯一标识符是一个16字节的数字,用于标志记录。
Date32
DateTime64
IPv4
IPv6
tips:IPv4是与UInt32类型保持兼容的类型,用于保存IPv4地址的值;而IPv6是与FixedString(16)兼容的类型,用于保存IPv6地址的值。
Float32
Float64
Decimal(P,S)
有符号定点数,在运算过程中保持精度。其中参数P表示精度,有效范围[1~38],决定有多少个十进制数字;参数S表示规模,有小范围[0~P],决定小数位的位数。
部分资料中定点数有Decimal32,Decimal64,Decimal128类型,其实是不同P参数的表示:
P取值[1~9],对应Decimal32(S);
P取值[10~18],对应Decimal64(S);
P取值[19~38],对应Decimal128(S);
Enum8
Enum16
ClickHouse中Enum类型用来保存String=Integer的映射关系,其中Enum8是String=Int8的描述,Enum16是String=Int16的描述。
Array(T)
由T类型组成的数组,T可以是任意类型,包含数组类型(但是不推荐,ClickHouse对多维数组的支持有限)。
Map(key,value)
用来保存k-v键值对类型的数据。其中参数key类型支持String/FixedString/Integer,参数value支持String/FixedString/Array/Integer。
Nullable
空类型,ClickHouse允许用NULL表示缺省值,如Nullable(Int8)可以保存Int8类型的值,没有值的行会存储为NULL。
注意:使用Nullable对数据库几乎总是负面影响!!!
建表语句示例:
- CREATE TABLE ALL_COLUMN_TYPE_Table
- (
- col1_Int8 Int8 COMMENT '字段Int8',
- col2_Int16 Int16 COMMENT '字段Int16',
- col3_Int32 Int32 COMMENT '字段Int32',
- col4_Int64 Int64 COMMENT '字段Int128',
- col5_Int128 Int128 COMMENT '字段UInt8',
- col6_UInt8 UInt8 COMMENT '字段UInt8',
- col7_UInt16 UInt16 COMMENT '字段UInt16',
- col8_UInt32 UInt32 COMMENT '字段UInt32',
- col9_UInt64 UInt64 COMMENT '字段UInt64',
- col10_UInt128 UInt128 COMMENT '字段UInt128',
- col11_UUID UUID COMMENT '字段UUID',
- col12_Date32 Date32 COMMENT '字段Date32',
- col13_DateTime64 DateTime64 COMMENT '字段DateTime64',
- col14_Float32 Float32 COMMENT '字段Float32',
- col15_Float64 Float64 COMMENT '字段Float64',
- col16_String String COMMENT '字段String',
- col17_Enum8 Enum8('a'=2,'b'=3) COMMENT '字段Enum8',
- col18_Enum16 Enum16('男'=1,'女'=2) COMMENT '字段Enum16',
- col19_FixedString FixedString(12) COMMENT '字段FixedString',
- col20_Decimal Decimal(16,12) COMMENT '字段Int8',
- col21_IPv4 IPv4 COMMENT '字段IPv4',
- col22_IPv6 IPv6 COMMENT '字段IPv6',
- col23_Map Map(String, Int8) COMMENT '字段Map',
- col24_Array Array(IPv4) COMMENT '字段数组'
- )
- ENGINE = MergeTree
- ORDER BY col1_Int8
- PARTITION BY col24_Array
Tips:
(1)字段大小写敏感,`UP`和`up`会认为是两个字段。
(2)ClickHouse关键字部分大小写敏感,建议sql全部用大写,避免迷の错误。
(3)Array(T),T支持所有类型。
(4)不同引擎支持的建表参数有区别,如Log家族不支持索引和分区,具体参见4.2引擎说明。
(5)如果CREATE TABLE没有指定Schema,那么会建在default数据库中(If you do not specify the database name, the table will be in the default database.)。
(6)ClickHouse主键和排序键。官网对主键的说明如下:
- primary keys in ClickHouse are not unique for each row in a table
- The primary key of a ClickHouse table determines how the data is sorted
- when written to disk. Every 8,192 rows or 10MB of data (referred to
- as the index granularity) creates an entry in the primary key index file.
- This granularity concept creates a sparse index that can easily fit in
- memory, and the granules represent a stripe of the smallest amount of
- column data that gets processed during SELECT queries.
- The primary key can be defined using the PRIMARY KEY parameter. If you
- define a table without a PRIMARY KEY specified, then the key becomes the
- tuple specified in the ORDER BY clause. If you specify both a PRIMARY KEY
- and an ORDER BY, the primary key must be a subset of the sort order.
- The primary key is also the sorting key......
主键不唯一;主键用作写入排序;未定义主键会使用排序键排序,如果同时定义了主键和排序键,主键必须是排序键的子集。
这部分资料搬运自官网中文文档,建议直接访问官网:SQL语法 | ClickHouse Docs
数据检索,略。
表修改,ALTER操作只支持MergeTree家族引擎表。语法结构:
ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|CLEAR|COMMENT|MODIFY COLUMN ...
SHOW查询,语法结构:
- #table
- SHOW CREATE [TEMPORARY] [TABLE|DICTIONARY] [db.]table [INTO OUTFILE filename] [FORMAT format]
-
- #database
- SHOW DATABASES [INTO OUTFILE filename] [FORMAT format]
-
- #processlist
- SHOW PROCESSLIST [INTO OUTFILE filename] [FORMAT format]
DESCRIBE TABLE,语法结构:
DESC|DESCRIBE TABLE [db.]table [INTO OUTFILE filename] [FORMAT format]
删除操作,语法结构:
- #table
- DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster]
-
- #dictionary
- DROP DICTIONARY [IF EXISTS] [db.]name
-
- #user
- DROP USER [IF EXISTS] name [,...] [ON CLUSTER cluster_name]
注意:DROP操作大小写敏感!!!
创建操作,语法结构:
- #table
- CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
- (
- name1 [type1] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr1] [compression_codec] [TTL expr1] [COMMENT 'comment for column'],
- name2 [type2] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr2] [compression_codec] [TTL expr2] [COMMENT 'comment for column'],
- ...
- ) ENGINE = engine
- COMMENT 'comment for table'
-
- #database
- CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)]
-
- #view
- CREATE [OR REPLACE] VIEW [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster_name] AS SELECT ...
插入操作,语法结构:
INSERT INTO [TABLE] [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
tips:ClickHouse有2类解析器:完整SQL解析器和数据格式解析器,除了INSERT查询,其他情况下使用完整SQL解析器。可以通过设置input_format_values_interpret_expressions参数,当其值为1时,ClickHouse优先使用数据格式解析器(快速流式解析器),如果失败,ClickHouse会在尝试使用完整SQL解析器。
通过PARTITION BY关键字定义分区信息。
分区主要目的是降低扫描范围,优化查询速度。
MergeTree家族可以使用分区键。设置分区的表会通过指定的规则划分为逻辑数据库,为减少操作,分区是分开存储的,访问数据时候ClickHouse尽量使用分区的最小子集。
分区支持表达式和元数据,如:
PARTITION BY (toMonday(StartDate), EventType)
可通过如下语句查看表分区信息:
- SELECT
- partition,
- name,
- active
- FROM system.parts
- WHERE table = 'ALL_COLUMN_TYPE_Table'
通过ORDER BY关键字定义排序。
排序键支持多个字段集合,如:
- #list,需要括号
- ORDER BY (col1_Int8,col4_Int64)
- #单个字段
- ORDER BY col1_Int8
Tips:部分资料中表示排序键是必填字段,这种论述是错误。正确论述应该是——排序键和主键必须指定至少一个!
You must provide an ORDER BY or PRIMARY KEY expression in the table definition.
如下建表语句是正确可执行的:
- CREATE TABLE ALL_COLUMN_TYPE_Table9
- (
- col1_Int8 Int8 COMMENT '字段Int8',
- col2_Int16 Int16 COMMENT '字段Int16',
- col3_Int32 Int32 COMMENT '字段Int32',
- col4_Int64 Int64 COMMENT '字段Int128',
- col5_Int128 Int128 COMMENT '字段UInt8',
- col6_UInt8 UInt8 COMMENT '字段UInt8',
- col7_UInt16 UInt16 COMMENT '字段UInt16',
- col8_UInt32 UInt32 COMMENT '字段UInt32',
- col9_UInt64 UInt64 COMMENT '字段UInt64',
- col10_UInt128 UInt128 COMMENT '字段UInt128',
- col11_UUID UUID COMMENT '字段UUID',
- col12_Date32 Date32 COMMENT '字段Date32',
- col13_DateTime64 DateTime64 COMMENT '字段DateTime64',
- col14_Float32 Float32 COMMENT '字段Float32',
- col15_Float64 Float64 COMMENT '字段Float64',
- col16_String String COMMENT '字段String',
- col17_Enum8 Enum8('a'=2,'b'=3) COMMENT '字段Enum8',
- col18_Enum16 Enum16('男'=1,'女'=2) COMMENT '字段Enum16',
- col19_FixedString FixedString(12) COMMENT '字段FixedString',
- col20_Decimal Decimal(16,12) COMMENT '字段Int8',
- col21_IPv4 IPv4 COMMENT '字段IPv4',
- col22_IPv6 IPv6 COMMENT '字段IPv6',
- col23_Map Map(String, Int8) COMMENT '字段Map',
- col24_Array Array(IPv4) COMMENT '字段数组'
- )
- ENGINE = MergeTree
- PRIMARY KEY col3_Int32
通过PRIMARY KEY语法指定。
主键支持字段集合,如下:
- #list
- PRIMARY KEY (col1_Int8,col3_Int32,col5_Int128)
-
- #单个字段
- PRIMARY KEY col1_Int8
ClickHouse引擎可以分为两类:数据库引擎和表引擎。
创建数据库语法结构:
- CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
- ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...]
| 引擎 | 说明 |
| MaterializedMySQL | 实验性,生产中禁止使用。 |
| MySQL | 用于将远程MySQL服务器中的表映射到ClickHouse中,允许对表进行SELECT和INSERT查询。 |
| Lazy | 为存储较小的*Log表优化的,访问之间会存在很长的时间间隔。 |
| Atomic | 数据库Atomic中所有的表都会有唯一UUID,默认情况下使用Atomic数据引擎。 |
| SQLite | 允许连接到SQLite数据库,并支持ClickHouse和SQLite交换数据。 |
| PostgreSQL | 允许连接到远程PostgreSQL服务,支持读写操作。 |
主要有两类,一类是MergeTree家族,一类是Log家族。
| 引擎家族 | 引擎 | 说明 |
| MergeTree | VersionedCollapsingMergeTree | 允许快速写入不断变化的对象;删除后台中的旧对象状态。 |
| GraphiteMergeTree | 用来对Graphite数据进行瘦身(使用CK保存Graphite数据比较合适) | |
| AggregatingMergeTree | 适合用来做增量数据的聚合统计,包括物化视图等。 | |
| CollapsingMergeTree | 可以异步删除折叠行,可以有效降低存储量并提高SELECT效率。 | |
| MergeTree | 用来保存极大量数据到一张表中,数据片段可以按照一定规则合并。 | |
| ReplacingMergeTree | 和MergeTree相比,该引擎会删除排序键值相同的重复项。 | |
| SharedMergeTree | 插入吞吐量、后台合并吞吐量、扩缩容更快。 | |
| SummingMergeTree | 相同主键会合并为一行,可以有效减少存储空间和提高查询效率。 | |
| Log | Log | 适合临时数据,测试、演示、write-once表等 |
| SpripeLog | 写入数据量较小(小于百万)的场景下,该引擎比较适合。 | |
| TinyLog | 最简单的表引擎,数据保存在磁盘上,数据包都单独压缩在文件中。 |
Tips:Log家族引擎不支持索引,建表不支持ORDER BY/PRIMAEY/PARTITION BY
- Engine Log doesn't support
- PARTITION_BY, PRIMARY_KEY, ORDER_BY or SAMPLE_BY clauses.