1

假设我有一个模型

class MyModelList(db.Model):
  listed_props = db.StringListProperty(indexed=True)

我用

SELECT * from MyModelList where listed_props = 'a' and listed_props = 'b'

它会像我有一个模型一样具有几乎一样的性能(延迟方面)吗

class MyModelProps(db.Model):
  property_1 = db.StringProperty(indexed=True)
  property_2 = db.StringProperty(indexed=True)

我会查询:

SELECT * from MyModelProps where property_1 = 'a' and property_2 = 'b'

和综合指数

indexes:
- kind: MyModelProps
   properties:
   - name: property_1
   - name: property_2

使用 MyModelList 对第一个示例的查询似乎更难回答,因为与第二个示例(我假设 1 个二进制搜索以找到开始,然后阅读)。

如果 MyModelList.listed_props 的索引需要跨多个 bigtable tablet 分片,这将特别复杂。

我可以期望两者的性能(延迟方面)大致相同吗?

PS:我问的原因是因为我喜欢使用 MyModelList.listed_props 因为更新现有实体要便宜得多,因为我可以摆脱很多复合索引。

4

1 回答 1

0

性能方面,在没有复合索引的情况下进行查询是一个非常糟糕的主意,例如

SELECT * from MyModelList where listed_props = 'a' and listed_props = 'b'

如果你这样做,它的性能会更高

SELECT * from MyModelProps where property_1 = 'a' and property_2 = 'b'

使用复合索引,即使它不需要。

我已经实现了这两种解决方案,并在一个拥有 270 万条记录的实时系统中运行它。具有综合指数的那个快了大约 100 倍。

有一篇很棒的文章解释了这一切:

http://www.allbuttonspressed.com/blog/django/2010/01/An-App-Engine-limitation-you-didn-t-know-about

于 2012-08-29T06:33:08.227 回答