该引擎可将 ClickHouse 与 RocksDB 集成。
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = EmbeddedRocksDB([ttl, rocksdb_dir, read_only]) PRIMARY KEY(primary_key_name)
[ SETTINGS name=value, ... ]
引擎参数:
ttl - 值的生存时间。TTL 以秒为单位。如果 TTL 为 0,则使用常规的 RocksDB 实例 (不启用 TTL) 。
rocksdb_dir - 已存在的 RocksDB 的目录路径,或新创建的 RocksDB 的目标路径。使用指定的 rocksdb_dir 打开表。
read_only - 当 read_only 设置为 true 时,将使用只读模式。对于启用了 TTL 的存储,不会触发合并整理 (无论手动还是自动) ,因此不会移除任何已过期条目。
primary_key_name – 列列表中的任意列名。
primary key 为必填项,并且主键只支持一列。主键会以二进制形式序列化为 rocksdb key。
- 除主键外的列会按对应顺序以二进制形式序列化为
rocksdb 值。
- 对 key 使用
equals 或 in 过滤的查询将被优化为从 rocksdb 进行多键查找。
引擎设置:
optimize_for_bulk_insert – 表已针对批量插入进行优化 (插入管道会创建 SST 文件并将其导入 rocksdb 数据库,而不是写入 memtables) ;默认值:1。
bulk_insert_block_size - 通过批量插入创建的 SST 文件的最小大小 (以行数计) ;默认值:1048449。
示例:
CREATE TABLE test
(
`key` String,
`v1` UInt32,
`v2` String,
`v3` Float32
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key
还有一个 system.rocksdb 表,用于提供 RocksDB 统计信息:
SELECT
name,
value
FROM system.rocksdb
┌─name──────────────────────┬─value─┐
│ no.file.opens │ 1 │
│ number.block.decompressed │ 1 │
└───────────────────────────┴───────┘
你也可以通过 config 更改任意 RocksDB 选项:
<rocksdb>
<options>
<max_background_jobs>8</max_background_jobs>
</options>
<column_family_options>
<num_levels>2</num_levels>
</column_family_options>
<tables>
<table>
<name>TABLE</name>
<options>
<max_background_jobs>8</max_background_jobs>
</options>
<column_family_options>
<num_levels>2</num_levels>
</column_family_options>
</table>
</tables>
</rocksdb>
默认情况下,简单近似计数优化是关闭的,这可能会影响 count() 查询的性能。要启用此优化,
请将 optimize_trivial_approximate_count_query = 1。此外,此设置还会影响 EmbeddedRocksDB engine 的 system.tables;
启用后,可查看 total_rows 和 total_bytes 的近似值。
当向 EmbeddedRocksDB 插入新行时,如果键已存在,则会更新对应的值;否则会创建新键。
示例:
INSERT INTO test VALUES ('some key', 1, 'value', 3.2);
可以使用 DELETE 查询或 TRUNCATE 来删除行。
DELETE FROM test WHERE key LIKE 'some%' AND v1 > 1;
ALTER TABLE test DELETE WHERE key LIKE 'some%' AND v1 > 1;
可以使用 ALTER TABLE 查询来更新值。主键不能更新。
ALTER TABLE test UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;
支持一种适用于 EmbeddedRocksDB 表的特殊 direct join。
这种 direct join 无需在内存中构建哈希表,而是直接从
EmbeddedRocksDB 读取数据。
对于大型 joins,direct joins 的内存使用量可能会显著降低,
因为不需要创建哈希表。
要启用 direct joins:
SET join_algorithm = 'direct, hash'
当 join_algorithm 设置为 direct, hash 时,会尽可能使用直接 JOIN,
否则使用哈希 JOIN。
创建并向 EmbeddedRocksDB 表插入数据
CREATE TABLE rdb
(
`key` UInt32,
`value` Array(UInt32),
`value2` String
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key
INSERT INTO rdb
SELECT
toUInt32(sipHash64(number) % 10) AS key,
[key, key+1] AS value,
('val2' || toString(key)) AS value2
FROM numbers_mt(10);
创建并填充一个可与表 rdb join 的表
CREATE TABLE t2
(
`k` UInt16
)
ENGINE = TinyLog
INSERT INTO t2 SELECT number AS k
FROM numbers_mt(10)
将 join 算法设置为 direct
SET join_algorithm = 'direct'
INNER JOIN
SELECT *
FROM
(
SELECT k AS key
FROM t2
) AS t2
INNER JOIN rdb ON rdb.key = t2.key
ORDER BY key ASC
┌─key─┬─rdb.key─┬─value──┬─value2─┐
│ 0 │ 0 │ [0,1] │ val20 │
│ 2 │ 2 │ [2,3] │ val22 │
│ 3 │ 3 │ [3,4] │ val23 │
│ 6 │ 6 │ [6,7] │ val26 │
│ 7 │ 7 │ [7,8] │ val27 │
│ 8 │ 8 │ [8,9] │ val28 │
│ 9 │ 9 │ [9,10] │ val29 │
└─────┴─────────┴────────┴────────┘