0
点赞
收藏
分享

微信扫一扫

关于ClickHouse的表引擎和SQL操作

_karen 2023-09-22 阅读 38

目录

前言:

一.表引擎 (严格区分大小写)

1.TinyLog引擎

2.Memory 

3.MergeTree 

二.Sql操作 

clickhouse 和 mysql 的比较

1 create 

2  Insert

3 Update 和 Delete


前言:

一.表引擎 (严格区分大小写)

1.TinyLog引擎

创建表并使用TinyLog引擎:

CREATE TABLE tinylog_example (
id UInt32,
name String,
age UInt8
) ENGINE = TinyLog;

2.Memory 

创建表并使用Memory引擎:

CREATE TABLE memory_example (
id UInt32,
name String,
age UInt8
) ENGINE = Memory;

3.MergeTree 

创建表并使用MergeTree引擎:

CREATE TABLE mergetree_example (
id UInt32,
name String,
age UInt8
) ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(created_at)
ORDER BY (created_at, id)
SETTINGS index_granularity = 8192;

二.Sql操作 

1 create 

在 ClickHouse 中创建表的 SQL 语句与 MySQL 类似,但是需要指定引擎类型,例如,使用 MergeTree 引擎存储数据:

CREATE TABLE example_table (
column1 String,
column2 Int32,
column3 Float64
) ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(column3)
ORDER BY (column1, column2);

2  Insert

ClickHouse 的 INSERT 语法和 MySQL 基本一致

   1.标准 INSERT

INSERT INTO example_table(column1, column2, column3)
VALUES ('value1', 123, 1.23), ('value2', 456, 4.56);

    2 2.从表到表的插入

INSERT INTO example_table(column1, column2, column3)
SELECT column_a, column_b, column_c FROM example_table_2;

注意,使用 INSERT INTO 语句插入数据时,数据会先缓存在内存中,并不是立即写入磁盘,需要手动执行 optimize table  或等待后台自动执行。

3 Update Delete

在 ClickHouse 中,Mutation 查询包括 Delete 和 Update 两种操作,并且不支持事务。Mutation 查询会导致目标数据的原有分区被放弃,重建新分区,因此最好进行批量的变更,避免频繁小数据的操作。

以下是 Delete 和 Update 的示例 SQL 语句:

   3.1.删除操作

ALTER TABLE t_order_smt DELETE WHERE sku_id = 'sku_001';

    3.2.修改操作

ALTER TABLE t_order_smt UPDATE total_amount = toDecimal32(2000.00, 2) WHERE id = 102;

Mutation 查询的操作比较“重”,因此它分两步执行。同步执行的部分其实只是进行新增数据新增分区和把旧分区打上逻辑上的失效标记。直到触发分区合并的时候,才会删除旧数据释放磁盘空间。一般不会开放这样的功能给用户,由管理员完成。

示例:

-- 创建表 t_order_smt 并插入数据
CREATE TABLE t_order_smt
(
id UInt32,
sku_id String,
total_amount Float32
)
ENGINE = MergeTree
PARTITION BY id
ORDER BY (id, sku_id);

INSERT INTO t_order_smt VALUES (101, 'sku_001', 1000.00), (102, 'sku_002', 1500.00);

-- 修改 id 为 102 的 total_amount
ALTER TABLE t_order_smt UPDATE total_amount = toDecimal32(2000.00, 2) WHERE id = 102;

-- 删除 sku_id 为 'sku_001' 的数据
ALTER TABLE t_order_smt DELETE WHERE sku_id = 'sku_001';
举报

相关推荐

0 条评论