Clickhouse 与 MySQL 常用转换

一、MySQL数据类型与ClickHouse数据类型的对应关系

MySQL类型 ClickHouse类型 备注
TINYINT Int8 MySQL的无符号版本(TINYINT UNSIGNED)对应ClickHouse的UInt8
SMALLINT Int16 MySQL的无符号版本(SMALLINT UNSIGNED)对应ClickHouse的UInt16
MEDIUMINT Int32 MySQL的无符号版本(MEDIUMINT UNSIGNED)对应ClickHouse的UInt32
INT Int32 MySQL的无符号版本(INT UNSIGNED)对应ClickHouse的UInt32
BIGINT Int64 MySQL的无符号版本(BIGINT UNSIGNED)对应ClickHouse的UInt64
FLOAT Float32
DOUBLE Float64
DATE Date
DATETIME, TIMESTAMP DateTime ClickHouse的DateTime可以指定时区
TIME Int32/String 可以用Int32表示秒数,或String存储原始时间字符串
CHAR, VARCHAR String ClickHouse中没有VARCHAR的长度限制,统一使用String类型
TEXT, MEDIUMTEXT, LONGTEXT String ClickHouse的String类型可以存储大文本
BINARY, VARBINARY FixedString(N)/String FixedString(N)用于固定长度,String用于可变长度
BLOB String
ENUM Int8/Int16/String 通常将ENUM映射为整数类型或String,并在应用层维护映射
SET Array(Int8/Int16)/String 将SET映射为整数数组或String,并在应用层维护映射
JSON String 使用String存储JSON数据,可用内置函数解析

请注意,这个表格提供了一般的对应关系和建议。在实际的迁移或数据设计过程中,可能需要根据特定的数据特征和使用场景进行适当的调整。例如,对于时间类型,如果需要精确到毫秒或微秒,ClickHouse提供了DateTime64类型。此外,ClickHouse也支持更多复杂的数据类型如数组(Array)、元组(Tuple)和嵌套类型(Nested),可以用于表示更复杂的数据结构。

二、包含了各种数据类型的建表语句

sql 复制代码
sqlCopy code
CREATE TABLE sample_table
(
    -- 数字类型
    user_id UInt32,
    age Int8,
    score Float32,
    height Float64,

    -- 日期和时间类型
    birth_date Date,
    last_login DateTime('Asia/Shanghai'),  -- 指定时区
    event_timestamp DateTime64(3),  -- 支持毫秒精度

    -- 字符串类型
    user_name String,
    email FixedString(255),

    -- 数组类型(Array)
    recent_scores Array(Int16),
    tags Array(String),

    -- 枚举类型
    gender Enum8('male' = 1, 'female' = 2, 'other' = 3),

    -- 元组类型(Tuple)
    coordinate Tuple(Float64, Float64),

    -- 嵌套类型(Nested)
    visits Nested
    (
        date Date,
        url String
    ),

    -- 低基数类型(适用于有限的字符串集合)
    device_type LowCardinality(String),

    -- JSON字符串
    user_preferences String,

    -- UUID类型
    session_id UUID
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(birth_date)
ORDER BY (user_id, last_login)
SETTINGS index_granularity = 8192;

这个示例展示了ClickHouse支持的各种数据类型:

  • 数字类型 :如UInt32, Int8, Float32, Float64等。
  • 日期和时间类型Date, DateTime(可以指定时区),以及支持高精度的DateTime64
  • 字符串类型String和固定长度的FixedString
  • 数组类型Array):可以存储同一类型数据的数组,如Array(Int16), Array(String)等。
  • 枚举类型Enum8, Enum16):用于表示有限的集合,每个元素有对应的整数值。
  • 元组类型Tuple):可以包含多个不同类型的字段。
  • 嵌套类型Nested):用于表示重复的结构化数据,如日志条目。
  • 低基数类型LowCardinality):用于优化存储和查询性能,适用于值的集合较小的字段。
  • UUID类型:用于存储UUID值。

请注意,user_preferences字段虽然声明为String类型,但可以用于存储JSON字符串,并使用ClickHouse的JSON函数进行解析和查询。此外,表的分区和排序键以及索引粒度(index_granularity)都是根据数据访问模式来设定的,以优化查询性能。

三、SETTINGS index_granularity = 8192; 这句话是什么意思

在ClickHouse中,SETTINGS index_granularity = 8192; 这句话用于指定表的索引粒度。索引粒度是ClickHouse中一个重要的性能配置参数,它决定了数据存储时的索引间隔大小。

索引粒度(Index Granularity)的含义

  • 索引粒度定义了每个索引块(也称为数据块或标记)中存储的数据行数。在给定的粒度下,每8192行数据会存储一个索引项。
  • 当执行查询时,ClickHouse利用这些索引项来快速定位到包含所需数据的数据块,从而减少需要读取的数据量,提高查询效率。

对性能的影响

  • 较小的索引粒度可以提高查询性能,因为它使得ClickHouse更精确地定位到包含查询数据的小块。然而,这会增加索引的大小,从而占用更多的内存和磁盘空间。
  • 较大的索引粒度减少了索引的大小,节约内存和磁盘空间,但可能会降低查询性能,因为每次查询可能需要读取更多的数据。

默认值和调整

  • ClickHouse的默认索引粒度通常是8192,这是一个在许多场景下都比较合理的平衡值。
  • 根据您的具体数据访问模式和性能需求,您可以调整这个值。例如,如果您的查询通常涉及到大量的顺序扫描,增加索引粒度可能有助于提高性能。相反,如果您的查询需要非常精确地定位少量行,减小索引粒度可能更有效。

总的来说,SETTINGS index_granularity = 8192; 这句话在创建表时设置了表的索引粒度为8192,这是影响查询性能和存储效率的一个关键配置。在实际应用中,应根据数据特性和查询需求调整此参数以达到最优性能。

四、MySQL分区语句转化为 CK

在ClickHouse中,如果您想创建与您提供的MySQL分区语句(例如PARTITION jfgw_point_pay_info_202001 VALUES LESS THAN ('2020-01-01 00:00:00'))相对应的特定时间范围的分区,您通常会使用基于日期或时间列的PARTITION BY表达式。ClickHouse根据您提供的分区键表达式动态地处理分区,因此您不需要像在MySQL中那样手动定义每个分区的范围。

下面是在ClickHouse中定义类似分区方案的方法:

scss 复制代码
sqlCopy code
CREATE TABLE jfgw_point_pay_info
(
    -- 您的列定义在这里
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(INSERT_TIME)  -- 通过月份对数据进行分区
ORDER BY (ID, INSERT_TIME);  -- 您的主键,用于每个分区内的排序

在这个例子中,PARTITION BY toYYYYMM(INSERT_TIME)会根据INSERT_TIME列自动为每个月创建一个新的分区。每个分区将包含所有INSERT_TIME的月份与分区键对应的行。您不需要手动为每个分区指定LESS THAN值;ClickHouse会根据PARTITION BY表达式自动管理这些。

如果您需要插入数据并确保它进入特定分区,您只需确保INSERT_TIME值落在所需的月份内。ClickHouse将根据PARTITION BY表达式自动将数据放置在正确的分区中。

对于高级用例,如果您需要更多控制分区的能力,超出了PARTITION BY表达式提供的范围,ClickHouse支持通过更复杂的表达式或手动数据操作来支持自定义分区方案。然而,对于大多数基于时间的分区需求,上面显示的方法应该足够了。

相关推荐
__风__13 分钟前
PostgreSQL kv(jsonb)存储
数据库·postgresql
Databend19 分钟前
Databend 产品月报(2025年6月)
数据库
Little-Hu1 小时前
QML TextEdit组件
java·服务器·数据库
保持学习ing3 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
宇钶宇夕4 小时前
EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
运维·服务器·数据库·程序人生·自动化
爱可生开源社区4 小时前
SQLShift 重磅更新:支持 SQL Server 存储过程转换至 GaussDB!
数据库
贾修行5 小时前
SQL Server 空间函数从入门到精通:原理、实战与多数据库性能对比
数据库·sqlserver
傲祥Ax5 小时前
Redis总结
数据库·redis·redis重点总结
一屉大大大花卷6 小时前
初识Neo4j之入门介绍(一)
数据库·neo4j
周胡杰6 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统