子图 > 最佳实践
3 分钟
子图最佳实践1-通过子图修剪提高查询速度
TLDR
修剪 会从子图的数据库中删除给定块内的存档实体,从子图数据库中删除未使用的实体将提高子图的查询性能,通常会显著提高。使用indexerHints是修剪子图的一种简单方法。
如何用indexerHints修剪子图
在清单中添加一个名为indexerHints的部分。
indexerHints有三个修剪选项:
prune:auto:保留Indexer设置的最小必要历史记录,优化查询性能。这是通常推荐的设置,也是graph-cli>=0.66.0创建的所有子图的默认设置。prune: <Number of blocks to retain>: 对要保留的历史块数量设置自定义限制。prune: never:不修剪历史数据;保留整个历史记录,如果没有indexerHints部分,则为默认设置。prune: never:如果需要Time Travel Queries,则不应选择修剪。
我们可以通过更新我们的subgraph.yaml将indexerHints添加到我们的子图中:
1specVersion: 1.3.02schema:3 file: ./schema.graphql4indexerHints:5 prune: auto6dataSources:7 - kind: ethereum/contract8 name: Contract9 network: mainnet重要注意事项
-
如果同样需要Time Travel Queries 和修剪,则必须准确执行修剪以保留Time Travel Query。因此,通常不建议在Time Travel Queries中使用
indexerHints: prune:auto。相反,修剪使用indexerHints: prune: <Number of blocks to retain>:修剪:精确修剪到保留Time Travel Queries所需历史数据的块高度,或使用prune: never维护所有数据。 -
在修剪过的块高度进行嫁接是不可能的。如果嫁接是常规操作,需要修剪,建议使用
indexerHints: prune: <Number of blocks to retain>,这将准确地保留一定数量的块(例如足够六个月)。
结论
使用indexerHints进行修剪是子图开发的最佳实践,可以显著提高查询性能。