假设我有一个模型
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,因为更新现有实体要便宜得多,因为我可以摆脱很多复合索引。答案 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