如何从Covalent DB查询RSK链上代币最新Transfer事件交易及查询无响应问题
查询无响应的可能原因
- 条件冗余触发全表扫描:你在WHERE子句中同时写了
e.topics @> array[Transfer事件哈希]和e.topics[1] = Transfer事件哈希两个功能重复的校验条件,Covalent数据库针对链上日志事件的默认联合索引仅对topics[1]的等值查询友好,冗余的数组包含查询会让数据库放弃走索引,改为全表扫描千万级的日志数据,导致查询超时。 - 缺少时间/区块范围限制:你没有对查询范围做任何限制,RSK主网上rUSDT的Transfer事件累计超过千万条,数据库需要扫描所有符合合约地址和事件哈希的日志,再关联交易表数据,数据处理量远超出单次查询的合理阈值。
- 排序逻辑不合理:你使用交易表的
signed_at字段做降序排序,该字段没有和日志表的关联字段做联合索引,数据库需要先完成所有符合条件的日志和交易的关联操作,再对全量结果做排序,无法直接利用索引的预排序能力快速返回最新的1000条数据。 - 公共查询资源受限:如果你使用的是Covalent的公共查询端点,节点本身有并发查询和单查询算力限制,同时间段如果有大量大查询运行,也会导致你的查询排队超时。
优化后的查询参考
SELECT t.signed_at, t.fees_paid FROM chain_rsk_mainnet.block_log_events e INNER JOIN chain_rsk_mainnet.block_transactions t ON e.block_id = t.block_id AND e.tx_offset = t.tx_offset WHERE e.topics[1] = E'\\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'::bytea AND e.sender = E'\\xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96'::bytea -- 可根据需求调整时间范围,减少扫描的数据量 AND e.block_signed_at >= NOW() - INTERVAL '180 days' -- 直接按日志表的区块高度、交易偏移排序,命中联合索引,无需额外排序 ORDER BY e.block_id DESC, e.tx_offset DESC LIMIT 1000
该优化方案删除了冗余条件、增加了时间范围限制、调整了排序逻辑,可将查询速度提升10~100倍,正常可在数秒内返回结果。
内容的提问来源于stack exchange,提问作者Gino Osahon
相关产品推荐
相关产品推荐

