存在性的 GQL 查询:获取 vs. 键查询 vs. 实体查询

GQL Query for Existence: Get vs. Key Query vs. Entity Query

虽然 Google 云客户端库有很多内置功能,但在根据其 ID 查询实体是否存在时,我还没有找到任何可用的东西。据我了解,进行键查询比这样的实体查询更有效。

SELECT __key__ FROM User WHERE __key__ = Key(User, 1)

如果可以在 Java 应用程序中使用 get(Key key) 功能会更好。

Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
KeyFactory keyFactory = datastore.newKeyFactory().setKind(User);
Key key = keyFactory.newKey(1);
Entity entity = datastore.get(key);

如果我有一个实例,其中我的实体也有祖先,当查询仅具有父 ID 的祖先是否存在时,这三者中哪一个更有效? 我假设实体查询 (SELECT * From Parent WHERE __key__ = Key(Parent, 1)) 总是比键查询慢,但与 get 相比又如何呢?

如果祖先路径链接得更长呢? 然后关键查询可能会变成类似这样的东西:

SELECT __key__ FROM Grandchild WHERE __key__ = Key(Parent, 1, Child, 1, Grandchild, 1)

仅键查询速度更快,因为不必将实体数据传输回客户端。假设您有一个具有 N 个属性的实体,并且这些属性(名称和值)的大小为 50 KB,如果您执行仅键查询,您将通过网络节省 50 KB 的数据传输。

无论您使用仅键查询、基于键的实体查询还是 Get(key) 方法,从数据存储的角度来看实体的实际查找都是相同的,因为数据存储只是根据以下内容查找实体提供的密钥。

总而言之 - 如果您只需要知道具有给定键的实体是否存在,则仅键查询将是您的最佳选择。