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

时间:2011-08-26 22:02:32

标签: google-app-engine query-optimization google-cloud-datastore

来自appengine博客:

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

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

的实体
class Entity(db.Model):
  tags = db.StringListProperty()

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

我的查询是

SELECT FROM Entity WHERE tags='1' and tags='2'

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

1 个答案:

答案 0 :(得分:2)

Google I / O 2009技术讲座Building Scalable, Complex Apps on App Engine中描述了内部使用的算法('merge-join')。自GAE推出以来,该功能也已推出;只有在创建多个StringListProperties的复合索引时才会出现'爆炸索引'。

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