【入门篇】ClickHouse 数据类型

news2024/12/28 18:24:08

文章目录

  • 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. 相似数据类型区别

  1. Int和UInt的差别:Int类型的整数可以是负数,而UInt类型的整数只能是非负的。

  2. Float32和Float64的差别:Float32是单精度浮点数,Float64是双精度浮点数。

  3. String和FixedString的差别:String类型可以存储任意长度的字符串,而FixedString类型则需要在定义时指定字符串的长度。

  4. Date, DateTime, DateTime64的差别:Date类型用于表示日期,DateTime用于表示日期和时间,而DateTime64则提供了更高的时间精度。

  5. Enum8和Enum16的差别:Enum8可以存储最多256个枚举值,而Enum16可以存储最多65536个枚举值。

  6. Tuple和Nested的定义和使用:Tuple类型可以存储一组不同类型的值,而Nested类型则可以存储一组结构相同的数据。

4. 其他数字类型

4.1. ClickHouse地理位置数据类型

  1. 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空值和非空值

  1. Null和NotNull的定义和使用:

Null:表示数据的缺失或未知值,可以在表定义时将某一列指定为 Nullable 类型,例如 Nullable(String)

NotNull:表示不允许存储空值,即数据必须有值。默认情况下,大多数数据类型都是 NotNull。

空值和非空值的使用场景:在某些情况下,数据可能不完整或者不能获取某些字段,可以使用 Nullable 类型存储数据。如果某一列数据总是存在,可以使用 NotNull 类型,这样可以提高查询性能。

4.3. ClickHouse数据类型转换

  1. 如何在不同的数据类型之间进行转换:可以使用CAST函数进行类型转换。例如,将String类型转为Int32类型:CAST('123' AS Int32)

  2. 数据类型转换的注意事项:在进行类型转换时,需要确保原数据能够成功转换为目标类型,否则可能会导致数据丢失或者转换错误。

4.4. ClickHouse数据类型的性能考虑

ClickHouse的数据类型选择对于存储空间和查询性能都有重要影响。在设计数据库架构时,考虑以下性能因素可以优化系统的性能:

1. 存储空间影响:

  • 数据类型大小:不同的数据类型在存储上占据的空间大小不同。选择较小的数据类型可以节省存储空间。例如,使用Int8代替Int32可以将整数存储空间减少为1/4。
  • 压缩:ClickHouse具有强大的数据压缩功能,可以显著减少数据存储的大小。根据数据类型的特性,选择合适的压缩算法和设置可以进一步减少存储空间占用。

2. 查询性能影响:

  • 数据类型的计算复杂度:某些数据类型的计算和操作可能比其他类型更复杂。例如,字符串类型的比较和模式匹配通常比整数类型更耗时。选择计算复杂度较低的数据类型可以提高查询性能。
  • 索引和过滤效率:索引和过滤是查询性能的关键。某些数据类型支持更高效的索引和过滤操作。例如,使用日期类型而不是字符串类型可以更快地进行时间范围查询。
  • 数据类型的顺序性:ClickHouse是一个列式数据库,数据按列存储。某些数据类型具有更好的顺序性,可以提高查询性能。例如,有序的整数类型比无序的字符串类型更易于压缩和查询。

在选择数据类型时,需要综合考虑存储空间、查询性能和数据语义的要求。需要根据具体的应用场景和数据特点进行权衡和测试,以获得最佳的性能和存储效率。

同时,还要注意避免过度优化。在某些情况下,微小的存储空间节省或查询性能提升可能并不值得引入复杂性和额外的开发成本。因此,评估和测试在真实场景下的综合性能表现是十分重要的。

数据类型存储空间占用
UInt81字节
Int81字节
UInt162字节
Int162字节
UInt324字节
Int324字节
UInt648字节
Int648字节
Float324字节
Float648字节
Decimal(M, D)取决于精度和规模(M+D+1)
String根据字符串长度和编码方式
FixedString(N)N字节
Date4字节
DateTime8字节
Enum81字节
Enum162字节
Array(T)根据元素类型和元素数量进行计算
Tuple(T1, T2,…)根据元素类型和元素数量进行计算
Nullable(T)根据基本类型和null值标志位进行计算
UUID16字节
IPv44字节
IPv616字节
Nested根据嵌套结构和各个字段的数据类型进行计算

以上是一些常见的ClickHouse数据类型及其在存储空间方面的一般影响。需要注意的是,实际存储空间可能会受到数据压缩、列引擎的特定设置以及其他因素的影响。因此,在具体应用中,最好进行实际测试和评估,以获取准确的存储空间占用情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1015430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGLM2-6B Lora 微调训练医疗问答任务

一、ChatGLM2-6B Lora 微调 LoRA 微调技术的思想很简单,在原始 PLM (Pre-trained Language Model) 增加一个旁路,一般是在 transformer 层,做一个降维再升维的操作,模型的输入输出维度不变,来模拟 intrinsic rank&…

【简单教程】利用Net2FTP构建免费个人网盘,实现便捷的文件管理

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一,特别是智能设备的大面积使用,无论是个人…

深入理解右值引用与移动语义

文章目录 写在前面1. 什么是右值,什么是左值?1.1右值引用可以引用左值吗1.2 左值引用、右值引用本身是左值还是右值?1.3 特殊的 const 左值引用 2. 右值引用与移动构造的意义3. 移动构造函数的使用4. move的实现原理5. 完美转发 写在前面 本…

Ocoya:快速创建社交媒体上的文字

【产品介绍】 名称 Ocoya 具体描述 Ocoya是一个人工智能文字创建平台,速度能提高10倍,节省高达80%的时间,在几分钟内完成内容营销、文案写作和社交媒体!可用于创建和安排社交媒体内容,减轻你的团队负担。 【团队介绍】…

KMP算法(C++)

KMP算法与BF算法不一样的在于,当主串与子串不匹配时,主串不回溯,选择了子串回溯,大大提高了运算效率。 借用了next1【】数组,让子串回溯。get_next函数求next1【】数组,get_next函数的实现难点在于下列几行…

数据库开发-MySQL基础DQL和多表设计

1. 数据库操作-DQL DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。 1.1 介绍 查询关键字:SELECT 查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使…

MC-4/11/01/400 ELAU 软件允许用户完全访问相机设置

MC-4/11/01/400 ELAU 软件允许用户完全访问相机设置 一个完整的Sentinel模具保护解决方案包括一到四台冲击式摄像机、专用红外LED照明和镜头、Sentinel软件以及所有与模压机连接的必要互连组件。摄像机支架基于磁性,可快速、安全、灵活地部署。此外,一个…

Kotlin Android中错误及异常处理最佳实践

Kotlin Android中错误及异常处理最佳实践 Kotlin在Android开发中的错误处理机制以及其优势 Kotlin具有强大的错误处理功能:Kotlin提供了强大的错误处理功能,使处理错误变得简洁而直接。这个特性帮助开发人员快速识别和解决错误,减少了调试代…

在SpringSecurity + SpringSession项目中如何实现当前在线用户的查询、剔除登录用户等操作

1、前言 在前一篇《在SpringBoot项目中整合SpringSession,基于Redis实现对Session的管理和事件监听》笔记中,已经实践了在SpringBoot SpringSecurity 项目中整合SpringSession,这里我们继续尝试如何统计当前在线用户,思路如下&am…

看好多人都在劝退学计算机,可是张雪峰又 推荐过计算机,所以计算机到底是什么样 的?

张雪峰高考四百多分,但是他现在就瞧不起400多分的学生。说难听点,六七百分的 热门专业随便报谁不会啊? 计算机专业全世界都是过剩的,今年桂林电子科技,以前还是华为的校招大学,今年 计算机2/3待业。这个世…

程序员兼职社区招募(内含技术指导)

👨‍💻作者简介:大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享。公众号: GoAI的学习小屋,免费分享书籍、简历、导图等资料&#xff0c…

flex:1的大坑

一、问题描述 整个类名为roomList 的大盒子设置了flex为1,与它同级的其他盒子都已经设置了宽高,但roomList 依然被内容撑开了,没有自适应 .roomList { flex: 1; } 二、原因分析 roomList的整个高度溢出,对于包裹roomList的父盒子…

pycharm安装(windows)

一、下载及安装 1.下载进入PyCharm官方下载地址: https://www.jetbrains.com/pycharm/download/ 下拉一下,直接下载社区版就行,是免费的,功能足够用了。 2.安装 (1) 找到你下载PyCharm的路径,双击.exe文件进行安装…

每日一题~合并二叉树

题目链接:617. 合并二叉树 - 力扣(LeetCode) 题目描述: 思路分析: 由图可知,当两个位置都有节点的时候,直接将两个节点的 val 相加就是结果,如果在一个位置两棵树只有一棵在此位置上…

Vim的基础操作

前言 本文将向您介绍关于vim的基础操作 基础操作 在讲配置之前,我们可以新建一个文件 .vimrc,并用vim打开在里面输入set nu 先给界面加上行数,然后shift ;输入wq退出 默认打开:命令模式 在命令模式中&#xff1a…

06乐观锁与悲观锁

乐观锁与悲观锁 悲观锁: 悲观锁比较适合插入数据,简单粗暴但是性能一般 乐观锁: 比较适合更新数据, 性能好但是成功率低(多个线程同时执行时只有一个可以执行成功),还需要访问数据库造成数据库压力过大 模拟乐观锁实现流程 第一步: 数据库中增加商品表t_product并插入一条数…

【MySQL】基础SQL语句——表的操作

文章目录 一. 创建表二. 查看表结构三. 修改表3.1 修改表名或列名3.2 插入数据3.3 添加列3.4 修改列类型3.5 删除列 四. 删除表结束语 一. 创建表 create table table_name(field1 datatype,field2 datatype...) charset 字符集 collate 校验规则 engine 存储引擎; 创建表 fiel…

07通用枚举和表的代码生成器

通用枚举 通用枚举 如果表中的有些字段值是固定的例如性别(男或女),此时我们可以使用MyBatis-Plus的通用枚举来为属性赋值 需求: 在数据库表添加字段sex 第一步: 设置枚举类型,使用EnumValue注解将注解所标识的属性值存储到数据库中 // 枚举类型只要设置getter方法 Getter …

2023/09/15 qt day1

代码实现图形化界面 #include "denglu.h" #include "ui_denglu.h" #include <QDebug> #include <QIcon> #include <QLabel> #include <QLineEdit> #include <QPushButton> denglu::denglu(QWidget *parent): QMainWindow(p…