GAE数据存储区:查询具有多个相等性的相同StringListProperty的性能

时间:2012-08-28 16:44:33

标签: python google-app-engine google-cloud-datastore

假设我有一个模型

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查询第一个示例似乎更难回答,因为与第二个示例相比,数据存储区必须将listed_props索引与其自身合并(我假设有2个二进制搜索来查找开始然后合并索引)假设1个二进制搜索找到开始,然后只读。)

如果需要在多个大表格平板电脑中对MyModelList.listed_props的索引进行分片,这将特别复杂。

我能指望两者的性能相同(延迟明智)吗?

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

1 个答案:

答案 0 :(得分: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