目录
clickhouse 和 mysql 的比较
5.1 create
5.2 Insert
1.标准 INSERT
2.从表到表的插入
5.3 Update 和 Delete
1.删除操作
2.修改操作
clickhouse 和 mysql 的比较
共同点:
- 都是关系型数据库,支持SQL查询语言;
- 支持事务处理,具备 ACID 特性(原子性、一致性、隔离性、持久性);
- 可以使用索引来提高查询效率;
- 支持备份和恢复数据。
优点:
ClickHouse:
- 面向列的存储模式,在 OLAP 场景下查询速度更快;
- 支持高并发和大规模数据的处理;
- 可以快速地处理复杂的数据分析和聚合操作;
- 支持分布式部署。
MySQL:
- 支持 OLTP 场景下的高并发,适用于在线事务处理;
- 支持多种存储引擎,可以根据不同场景选择不同的存储引擎;
- 支持主从复制和集群部署;
- 有丰富的社区支持,应用广泛
5.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);
解释:
example_table
是表名;column1
、column2
、column3
是表中的列名;String
、Int32
、Float64
是列的数据类型;ENGINE
指定了使用 MergeTree 引擎存储数据(还有TinyLog 和 memory)PARTITION BY
根据日期分区,partition key 为 column3;ORDER BY
指定了排序规则,按照 column1 和 column2 排序。
5.2 Insert
ClickHouse 的 INSERT 语法和 MySQL 基本一致
1.标准 INSERT
INSERT INTO example_table(column1, column2, column3)
VALUES ('value1', 123, 1.23), ('value2', 456, 4.56);
解释:
example_table
是要插入数据的表名;column1
、column2
、column3
是表中的列名;VALUES
后跟着要插入的数据,多条数据用逗号分隔2
2.从表到表的插入
INSERT INTO example_table(column1, column2, column3)
SELECT column_a, column_b, column_c FROM example_table_2;
解释:
example_table
是要插入数据的表名;column1
、column2
、column3
是表中的列名;SELECT
子句用于选取要插入的数据,从example_table_2
表中选取column_a
、column_b
、column_c
这三个列。
注意,使用 INSERT INTO 语句插入数据时,数据会先缓存在内存中,并不是立即写入磁盘,需要手动执行 optimize table 或等待后台自动执行。
5.3 Update 和 Delete
在 ClickHouse 中,Mutation 查询包括 Delete 和 Update 两种操作,并且不支持事务。Mutation 查询会导致目标数据的原有分区被放弃,重建新分区,因此最好进行批量的变更,避免频繁小数据的操作。
以下是 Delete 和 Update 的示例 SQL 语句:
1.删除操作
ALTER TABLE t_order_smt DELETE WHERE sku_id = 'sku_001';
解释:
t_order_smt
是要删除数据的表名;sku_id = 'sku_001'
为删除的过滤条件。
2.修改操作
ALTER TABLE t_order_smt UPDATE total_amount = toDecimal32(2000.00, 2) WHERE id = 102;
解释:
t_order_smt
是要修改数据的表名;total_amount = toDecimal32(2000.00, 2)
为修改的内容;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';