投影查询与常规查询

时间:2018-08-10 06:13:12

标签: google-cloud-datastore projection

在阅读Cloud Datastore上的文档后,很明显Get会检索整个实体,并且查询总是针对索引进行的。

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

  

通过投影查询,您可以查询Cloud Datastore中的那些数据   您实际需要的实体的特定属性,较低   延迟和成本,而不是检索整个实体

但是,如果所有查询都是针对索引进行的,那么查询将永远不会检索整个实体,因为一切都是从索引中获取的?如果我有一个具有3个属性(A,B和C)的索引,则使用常规查询或投影查询应该没有什么区别,因为我不能只“投影” A和B,因为索引也包含C,因此在此示例中,我将不得不“投影”与常规查询相同的属性?

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

1 个答案:

答案 0 :(得分:3)

this article(可能与您正在浏览的文章相同),Projection queries require all properties specified in the projection to be included in a Cloud Datastore index

而针对Cloud Datastore的“常规”(我指的是SELECT * ...)查询通常使用仅包含所查询实体属性的排序子集以及指向完整实体,投影的指针的索引查询针对包含查询所请求的所有字段的索引运行。因此,似乎很可观的延迟增加是由于通过索引识别出与查询匹配的实体集后,不再需要获取查询的实体。

因此,当您编写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)。

我还没有阅读过任何文档,即使您确实配置了包含特定数据存储类型的所有实体中所有属性的索引(这是不寻常的),查询引擎也将足够“聪明”以使用该索引即使在技术上可能的情况下也可以执行上述步骤#3而无需执行查询。确实,由于Cloud Datastore是无模式的,并且相同类型的实体可以具有不同的属性,所以即使知道索引是否包含给定实体的所有属性而不获取该实体,也比使用a实体要复杂得多。具有模式的数据库。