
我正在尝试使用 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 年 7 月 11 日 给你个建议,这种数据一旦产生就不再变了,特别适合用 Clickhouse 存着,我之前直接存储 Filecoin 链上的区块和消息,折腾的 mysql 分库分表啊麻烦死了,还折腾过 mangodb 集群和 cockroachdb ,最后发现 Clickhouse 最适合 |
2 dw2693734d OP @rickiey 这种数据要不断增加的,还是要变啊 |
3 rickiey 2023 年 7 月 11 日 增加没关系,只是写入,这也不影响,clickhous 更新和删除麻烦,我之前收集链上数据一天 50G ,到 1T 后不用了 |
4 slowgen 2023 年 7 月 11 日 碰到过类似需求,后面没在搞了,当时调研的方案是用 TimescaleDB 扩展,它官网教程也有专门用于存储区块链的 https://docs.timescale.com/tutorials/latest/blockchain-query/ ,有朋友公司基于这个自建的存储超过 200T 了 |