我正在尝试使用 Citus 对以太坊 ERC20 交易数据进行分片 (sharding)。我有一个查询,它基于 "to" 和 "from" 条件进行查询,并且根据 "token_address" 进行分组。
SELECT
distinct(token_address),
CONCAT('0x', SUBSTRING(token_address::text FROM 3)) as token,
sum(amount) as amount
FROM (
-- 转入
SELECT
"to" as address,
value as amount,
tr.contract_address as token_address
FROM erc20."ERC20_evt_Transfer" tr, address
WHERE "to" = address
-- 转出
UNION ALL
SELECT
"from" as address,
-value as amount,
tr.contract_address as token_address
FROM erc20."ERC20_evt_Transfer" tr, address
WHERE "from" = address
) as t
GROUP BY 1
这是一个查询以太坊 erc20 token 转账的记录
按道理来讲, from 和 to 都应该设置为 shard column, 但是这样的话要搞两个 shard table ,就很浪费硬盘空间。
ERC20_evt_Transfer 这个表,大约 400g
1
rickiey 2023-07-11 09:30:07 +08:00
给你个建议,这种数据一旦产生就不再变了,特别适合用 Clickhouse 存着,我之前直接存储 Filecoin 链上的区块和消息,折腾的 mysql 分库分表啊麻烦死了,还折腾过 mangodb 集群和 cockroachdb ,最后发现 Clickhouse 最适合
|
2
dw2693734d OP @rickiey 这种数据要不断增加的,还是要变啊
|
3
rickiey 2023-07-11 11:27:14 +08:00 1
增加没关系,只是写入,这也不影响,clickhouse 更新和删除麻烦,我之前收集链上数据一天 50G ,到 1T 后不用了
|
4
shuimugan 2023-07-11 14:13:43 +08:00 1
碰到过类似需求,后面没在搞了,当时调研的方案是用 TimescaleDB 扩展,它官网教程也有专门用于存储区块链的 https://docs.timescale.com/tutorials/latest/blockchain-query/ ,有朋友公司基于这个自建的存储超过 200T 了
|