appengine如何有效地在列表上实现查询?

Ala*_*lan 5 google-app-engine query-optimization google-cloud-datastore

来自appengine博客:

高级查询计划 - 我们不再需要爆炸索引并减少许多查询的自定义索引要求.SDK将在几种情况下建议更好的索引,即将发表的文章将描述可能的进一步优化.

作为测试,我在appengine中有一个具有listProperty的实体

class Entity(db.Model):
  tags = db.StringListProperty()
Run Code Online (Sandbox Code Playgroud)

我有500,000个实体,其中一半有标签= ['1'],另一半有标签= ['2']

我的疑问是

SELECT FROM Entity WHERE tags='1' and tags='2'
Run Code Online (Sandbox Code Playgroud)

它很快就没有返回结果.它有什么计划来实现这一目标?索引列表是如何实现这一目标的?在过去,需要一个爆炸性的指数.

bdo*_*lan 2

Google I/O 2009 技术演讲Building Scalable, Complex Apps on App Engine中描述了内部使用的算法(“合并连接”)。自 GAE 推出以来,该功能也已可用;仅当您创建多个 StringListProperties 的复合索引时,才会发生“爆炸索引”。

值得注意的是,这个功能实际上比您想象的更通用 - 任意属性组合上的多个相等过滤器的任何组合都可以在没有任何复合索引的情况下得到满足,只要它们都是相等过滤器并且您没有排序顺序。它们不必全部来自 StringListProperty,甚至可以分为多个 StringListProperty。