子图 > 最佳实践
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
进行修剪是子图开发的最佳实践,可以显著提高查询性能。