文章目录
- 1. 引言
- 2. ClickHouse 数据类型
- 2.1 基本数据类型
- 2.1.1 整型
- 2.1.2 浮点型
- 2.1.3 字符串型
- 2.2 复合数据类型
- 2.2.1 数组
- 2.2.2 枚举类型
- 2.2.3 元组
- 2.2.4 Map
- 2.2.5 Nullable
- 2.3 特殊数据类型
- 2.3.1 日期和时间类型
- 2.3.2 UUID
- 2.3.3 IP 地址
- 2.3.4 AggregateFunction
- 2.4 数据类型的选择和使用
- 2.4.1 如何选择合适的数据类型
- 2.4.2 数据类型转换
- 3. 相似数据类型区别
- 4. 其他数字类型
- 4.1. ClickHouse地理位置数据类型
- 4.2. ClickHouse空值和非空值
- 4.3. ClickHouse数据类型转换
- 4.4. ClickHouse数据类型的性能考虑
- 1. 存储空间影响:
- 2. 查询性能影响:
1. 引言
ClickHouse 数据库系统支持多种数据类型,以及复杂的表结构设计。以下是一篇可能的博文的详细目录,这篇博文将介绍 ClickHouse 的数据类型和表的结构设计。
2. ClickHouse 数据类型
数据类型 | 定义 | 使用场景 | 示例 |
---|---|---|---|
基本数据类型 | |||
整型(Int8, Int16, Int32, Int64) | 存储整数值,支持正负整数 | 存储年龄、统计数量等整数场景 | 年龄:25,浏览次数:1000 |
浮点型(Float32, Float64) | 存储小数值,支持不同精度的小数 | 存储价格、评分等需要精确到小数的数据 | 价格:23.5,评分:4.3 |
字符串型(String, FixedString) | 存储文本数据,支持可变长度和固定长度的字符串 | 存储名字、地址、描述等文本信息 | 姓名:“张三”,地址:“北京市” |
复合数据类型 | |||
数组(Array) | 存储同一类型的多个值 | 存储一篇文章的多个标签、一个订单的多个商品等 | 标签:[“科技”, “教育”] |
枚举类型(Enum) | 存储预定义的一组值,将字符串映射为整数 | 存储性别、订单状态等有限且固定的值 | 性别:男,订单状态:已支付 |
元组(Tuple) | 存储固定长度的有序列表,每个元素可以是任意类型 | 存储经纬度、RGB 颜色值等固定长度的组合数据 | 经纬度:(116.4, 39.9) |
Map | 存储键值对 | 存储用户的属性、商品的元数据等 | 用户属性:{“age”: 25, “city”: “北京”} |
Nullable | 存储可能为空的值,为任意类型的数据添加一个表示是否为空的标记 | 存储可能为空的字段,如用户的昵称、商品的优惠价格等 | 昵称:Nullable(“张三”) |
特殊数据类型 | |||
日期和时间类型(Date, DateTime) | 存储日期和时间 | 存储用户的注册时间、订单的创建时间等 | 注册时间:2021-08-01 |
UUID | 存储唯一标识符,生成全局唯一的随机字符串 | 存储用户的唯一 ID、订单的唯一 ID 等 | 用户ID:550e8400-e29b-41d4-a716-446655440000 |
IP 地址(IPv4, IPv6) | 存储 IP 地址 | 存储用户的 IP 地址、服务器的 IP 地址等 | 用户IP:192.168.1.1 |
AggregateFunction | 存储聚合函数的状态 | 统计用户的平均活跃时长、计算商品的销售总额等 | 平均活跃时长:5.5 小时 |
2.1 基本数据类型
2.1.1 整型
整型是整数形式的数据类型,支持正负整数的存储。ClickHouse 支持多种整型,如 Int8, Int16, Int32, Int64 等,每种类型分别支持的数据范围不同。例如,Int8 支持 -128 到 127 的整数,而 Int32 支持 -2147483648 到 2147483647 的整数。根据你的数据大小和需求来选择合适的整数类型。
使用场景:存储年龄、统计数量等整数场景。
2.1.2 浮点型
浮点型是小数形式的数据类型。ClickHouse 提供 Float32 和 Float64 两种浮点数类型,用于存储小数。Float32 支持约 7 位精度的小数,而 Float64 支持约 15 位精度的小数。
使用场景:存储价格、评分等需要精确到小数的数据。
2.1.3 字符串型
字符串型用于存储文本数据。ClickHouse 中的字符串类型包括 String 和 FixedString。String 用于存储可变长度的字符串,FixedString 用于存储固定长度的字符串。
使用场景:存储名字、地址、描述等文本信息。
2.2 复合数据类型
2.2.1 数组
Array 类型用于存储同一类型的多个值。它可以存储任意类型的数据,包括基本类型和复合类型。
使用场景:存储一篇文章的多个标签、一个订单的多个商品等。
2.2.2 枚举类型
Enum 类型用于存储预定义的一组值。它可以将字符串映射为整数,从而节省存储空间,并提高查询效率。
使用场景:存储性别、订单状态等有限且固定的值。
2.2.3 元组
Tuple 类型用于存储固定长度的有序列表。元组中的每个元素可以是任意类型。
使用场景:存储经纬度、RGB 颜色值等固定长度的组合数据。
2.2.4 Map
Map 类型用于存储键值对。它可以方便地查询和更新数据。
使用场景:存储用户的属性、商品的元数据等。
2.2.5 Nullable
Nullable 类型用于存储可能为空的值。它可以为任意类型的数据添加一个表示是否为空的标记。
使用场景:存储可能为空的字段,如用户的昵称、商品的优惠价格等。
2.3 特殊数据类型
2.3.1 日期和时间类型
ClickHouse 提供 Date 和 DateTime 类型,用于存储日期和时间。Date 类型用于存储日期(年月日),DateTime 类型用于存储日期和时间。
使用场景:存储用户的注册时间、订单的创建时间等。
2.3.2 UUID
UUID 类型用于存储唯一标识符。它可以生成全局唯一的随机字符串。
使用场景:存储用户的唯一 ID、订单的唯一 ID 等。
2.3.3 IP 地址
ClickHouse 提供 IPv4 和 IPv6 类型,用于存储 IP 地址。
使用场景:存储用户的 IP 地址、服务器的 IP 地址等。
2.3.4 AggregateFunction
AggregateFunction 类型用于存储聚合函数的状态。它可以方便地进行聚合查询。
使用场景:统计用户的平均活跃时长、计算商品的销售总额等。
2.4 数据类型的选择和使用
2.4.1 如何选择合适的数据类型
选择数据类型时,需要考虑数据的性质、业务的需求和查询的效率等因素。例如,如果数据可能为空,则应该选择 Nullable 类型;如果数据有限并且固定,则可以考虑使用 Enum 类型。
2.4.2 数据类型转换
ClickHouse 提供了一系列的函数,可以在不同的数据类型之间进行转换。例如,可以使用 toString 函数将数字转换为字符串,使用 toInt32 函数将字符串转换为整数。
3. 相似数据类型区别
-
Int和UInt的差别:Int类型的整数可以是负数,而UInt类型的整数只能是非负的。
-
Float32和Float64的差别:Float32是单精度浮点数,Float64是双精度浮点数。
-
String和FixedString的差别:String类型可以存储任意长度的字符串,而FixedString类型则需要在定义时指定字符串的长度。
-
Date, DateTime, DateTime64的差别:Date类型用于表示日期,DateTime用于表示日期和时间,而DateTime64则提供了更高的时间精度。
-
Enum8和Enum16的差别:Enum8可以存储最多256个枚举值,而Enum16可以存储最多65536个枚举值。
-
Tuple和Nested的定义和使用:Tuple类型可以存储一组不同类型的值,而Nested类型则可以存储一组结构相同的数据。
4. 其他数字类型
4.1. ClickHouse地理位置数据类型
- Point、LineString、Polygon等类型的定义和使用:
Point:用于表示地球表面上一个点的地理位置。例如:Point(经度, 纬度)
如 Point(30.5, 50.2)
。
LineString:表示一系列连接的线段,由多个Point构成。例如:LineString(Point(30.5, 50.2), Point(31.5, 51.2), Point(32.5, 52.2))
。
Polygon:表示一个多边形区域,由多个点组成的环状结构。例如:Polygon((30.5, 50.2), (31.5, 51.2), (32.5, 52.2), (30.5, 50.2))
,注意首尾点需相同。
地理位置数据类型的使用场景:适用于存储和查询地理空间信息,例如地图应用、物流、出行等需要进行地理位置分析的场景。
4.2. ClickHouse空值和非空值
- Null和NotNull的定义和使用:
Null:表示数据的缺失或未知值,可以在表定义时将某一列指定为 Nullable 类型,例如 Nullable(String)
。
NotNull:表示不允许存储空值,即数据必须有值。默认情况下,大多数数据类型都是 NotNull。
空值和非空值的使用场景:在某些情况下,数据可能不完整或者不能获取某些字段,可以使用 Nullable 类型存储数据。如果某一列数据总是存在,可以使用 NotNull 类型,这样可以提高查询性能。
4.3. ClickHouse数据类型转换
-
如何在不同的数据类型之间进行转换:可以使用
CAST
函数进行类型转换。例如,将String类型转为Int32类型:CAST('123' AS Int32)
。 -
数据类型转换的注意事项:在进行类型转换时,需要确保原数据能够成功转换为目标类型,否则可能会导致数据丢失或者转换错误。
4.4. ClickHouse数据类型的性能考虑
ClickHouse的数据类型选择对于存储空间和查询性能都有重要影响。在设计数据库架构时,考虑以下性能因素可以优化系统的性能:
1. 存储空间影响:
- 数据类型大小:不同的数据类型在存储上占据的空间大小不同。选择较小的数据类型可以节省存储空间。例如,使用Int8代替Int32可以将整数存储空间减少为1/4。
- 压缩:ClickHouse具有强大的数据压缩功能,可以显著减少数据存储的大小。根据数据类型的特性,选择合适的压缩算法和设置可以进一步减少存储空间占用。
2. 查询性能影响:
- 数据类型的计算复杂度:某些数据类型的计算和操作可能比其他类型更复杂。例如,字符串类型的比较和模式匹配通常比整数类型更耗时。选择计算复杂度较低的数据类型可以提高查询性能。
- 索引和过滤效率:索引和过滤是查询性能的关键。某些数据类型支持更高效的索引和过滤操作。例如,使用日期类型而不是字符串类型可以更快地进行时间范围查询。
- 数据类型的顺序性:ClickHouse是一个列式数据库,数据按列存储。某些数据类型具有更好的顺序性,可以提高查询性能。例如,有序的整数类型比无序的字符串类型更易于压缩和查询。
在选择数据类型时,需要综合考虑存储空间、查询性能和数据语义的要求。需要根据具体的应用场景和数据特点进行权衡和测试,以获得最佳的性能和存储效率。
同时,还要注意避免过度优化。在某些情况下,微小的存储空间节省或查询性能提升可能并不值得引入复杂性和额外的开发成本。因此,评估和测试在真实场景下的综合性能表现是十分重要的。
数据类型 | 存储空间占用 |
---|---|
UInt8 | 1字节 |
Int8 | 1字节 |
UInt16 | 2字节 |
Int16 | 2字节 |
UInt32 | 4字节 |
Int32 | 4字节 |
UInt64 | 8字节 |
Int64 | 8字节 |
Float32 | 4字节 |
Float64 | 8字节 |
Decimal(M, D) | 取决于精度和规模(M+D+1) |
String | 根据字符串长度和编码方式 |
FixedString(N) | N字节 |
Date | 4字节 |
DateTime | 8字节 |
Enum8 | 1字节 |
Enum16 | 2字节 |
Array(T) | 根据元素类型和元素数量进行计算 |
Tuple(T1, T2,…) | 根据元素类型和元素数量进行计算 |
Nullable(T) | 根据基本类型和null值标志位进行计算 |
UUID | 16字节 |
IPv4 | 4字节 |
IPv6 | 16字节 |
Nested | 根据嵌套结构和各个字段的数据类型进行计算 |
以上是一些常见的ClickHouse数据类型及其在存储空间方面的一般影响。需要注意的是,实际存储空间可能会受到数据压缩、列引擎的特定设置以及其他因素的影响。因此,在具体应用中,最好进行实际测试和评估,以获取准确的存储空间占用情况。