投影查询与常规查询

Projection Queries vs. Regular Queries

阅读有关 Cloud Datastore 的文档,很明显 Get 检索整个实体,并且始终针对索引进行查询。

这是令人困惑的地方,因为根据 documentation:

Projection queries allow you to query Cloud Datastore for just those specific properties of an entity that you actually need, at lower latency and cost than retrieving the entire entity

但是如果所有查询都是针对索引完成的,那么查询将永远不会检索整个实体,因为所有内容都是从索引中获取的?如果我有一个包含 3 个属性(A、B 和 C)的索引,那么使用常规查询或投影查询应该没有任何区别,因为我不能 "project" 只有 A 和 B 作为索引也包含 C,所以在这个例子中我必须 "project" 与常规查询相同的属性?

在我看来,只有在索引不包含实体的所有属性时才能真正使用投影查询?因此,如果一个实体没有很多属性,那么使用投影就没有任何意义,因为大多数(如果不是全部)查询无论如何都会 using/getting 所有属性?我想知道在这种情况下使用投影在成本方面是否有意义,因为文档说投影有 lower latency and cost 但在获取所有属性时这是否适用于投影?

根据 this article(可能是您正在查看的同一篇文章),Projection queries require all properties specified in the projection to be included in a Cloud Datastore index

而 "regular"(我的意思是 SELECT * ...)针对 Cloud Datastore 的查询通常使用仅包含查询实体属性的排序子集的索引,以及指向完整实体,投影查询 运行 针对包含查询请求的所有字段的索引。因此,一旦通过索引识别出与查询匹配的实体集,就可以消除获取查询实体的需要,从而显着增加延迟。

所以当您写 if all queries are done against an index, a query would never retrieve the entire entity anyway as everything is taken from the index? 时,这是不准确的:非投影查询将:

  1. 确定有效完成查询所需的索引(如果索引不存在,将引发异常)
  2. 使用它来获取指向匹配实体的指针,并且
  3. 获取那些匹配的实体

据我所知,投影查询是 Cloud Datastore 提供的唯一机制,用于仅使用索引(没有上面的第 3 步)来完成查询。

我没有读过任何文档表明,即使您确实配置了包含特定数据存储类型的所有实体的所有属性的索引(这很不寻常),查询引擎也将是 "smart" 即使在技术上 可能的情况下,也足以使用该索引来完成查询而无需上面的第 3 步。事实上,由于 Cloud Datastore 是无模式的,并且同类实体可以具有不同的属性,因此即使知道索引是否包含给定实体的所有属性而不获取该实体,也将是一项比使用索引更复杂的任务。具有模式的数据库。