我可以使用 clickhouse 作为键值存储吗?

Can I use clickhouse as key-value storage?

是否可以使用clickhouse作为键值存储,数据是否经常被覆盖,但很少被读取?如果可能,我应该使用什么引擎?

ClickHouse 不是为该用例构建的,它故意在其文档的主页中这样说。

When NOT to use ClickHouse

  1. Transactional workloads (OLTP)
  2. Key-value access with high request rate
  3. Blob or document storage
  4. Over-normalized data

不过,如果QPS低,点查询的延迟分数还是可以的。 ClickHouse还提供了多种Dictionaries,可以更好的作为外部key-value存储。还有一个StorageJoin引擎,支持类似于redis的HGET操作的joinGet功能。在此之后 PR 您可以覆盖 StorageJoin.

中的现有密钥

更新

PR 合并。这是一个孤立的例子。

首先填充 StorageJoin table 如下:

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);

然后你可以把它当作一个字典(key-value)来使用:

SELECT joinGet('my_fancy_kv_store', 'x', 'abc');
SELECT joinGet('my_fancy_kv_store', 'k', 'def');

EmbeddedRocksDB table 引擎是最近添加的,可以提供帮助。

可在此处找到更多信息: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 的限制)