是否可以将Clickhouse用作键值存储,数据是否经常被覆盖,但很少读取?如果可能,我应该使用什么引擎?
答案 0 :(得分:5)
ClickHouse不是针对该用例而构建的,它故意在其文档的首页中对此进行了说明。
何时不使用ClickHouse
- 事务性工作负载(OLTP)
- 具有高请求率的键值访问
- blob或文档存储
- 过度标准化的数据
但是,如果QPS较低,您仍然可以为点查询获得良好的延迟分数。 ClickHouse还提供了多种词典,可以更好地用作外部键值存储。还有一个StorageJoin
引擎,支持joinGet
功能,类似于redis的HGET
操作。 PR之后,您可以覆盖StorageJoin
中的现有密钥。
PR被合并。这是一个孤立的示例。
首先按如下所示填充StorageJoin表:
CREATE TABLE my_fancy_kv_store (s String, x Array(UInt8), k UInt64)
ENGINE = Join(ANY, LEFT, s);
INSERT INTO my_fancy_kv_store VALUES ('abc', [0], 1), ('def', [1, 2], 2);
然后您可以将其用作字典(键值):
SELECT joinGet('my_fancy_kv_store', 'x', 'abc');
SELECT joinGet('my_fancy_kv_store', 'k', 'def');
答案 1 :(得分:0)
EmbeddedRocksDB 表引擎是最近添加的,可以提供帮助。
可以在此处找到更多信息:https://kb.altinity.com/engines/altinity-kb-embeddedrocksdb-and-dictionary
在我的测试中,与 MergeTree
相比,我发现 EmbeddedRocksDB
处理的 QPS 提高了 10-20 倍,响应速度提高了 10-100 倍。
它可能因用例而异,但它足以让我不必费心寻找单独的 Redis / RocksDB / DynamoDB
安装(因为在 CH 内拥有 KV 存储有助于跨 MT 和 EmbeddedRocksDB 加入,我真的不需要扩展到 redis / DDB 的限制)