【问题标题】:How does appengine implement query on a list efficiently?appengine 如何高效地实现对列表的查询?
【发布时间】:2011-08-26 22:02:31
【问题描述】:

来自 appengine 博客:

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

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

class Entity(db.Model):
  tags = db.StringListProperty()

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

我的查询是

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

它很快就不会返回任何结果。它使用什么计划来实现这一目标?列表如何索引以实现此目的?在过去,需要一个爆炸式的索引。

【问题讨论】:

  • IIRC 这在其中一个技术讲座中有所涉及 - 它从不需要爆炸索引,只需要一个 StringListProperty
  • 高级查询计划更改不会影响此查询。你是如何插入实体的?如果所有 tags=2 的 ID 都比 tags=1 的 ID 高(反之亦然),这个查询很容易满足。
  • 我认为查询的意思是:SELECT FROM Entity WHERE tags='1' and tags='2' ORDER BY date

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2017-03-21
    • 1970-01-01
    • 2013-03-29
    相关资源
    最近更新 更多