0

如果我有一个具有索引属性的实体,比如“名称”,那么 == 对该属性的查询的性能会如何?

当然,我知道不可能有确切的答案,但是性能与name == x某些 x 的实体总数、数据存储中的实体总数等有何关联?

name == x如果我有 1000 个名称等于 x 的实体与 100 个实体相比,查询会慢多少?是否对此进行了任何类型的基准测试?

4

2 回答 2

2

我的一些不是很费力的测试表明响应时间随着返回的结果数量大致线性增加。请注意,即使您有 1000 个实体,如果您在查询中添加 limit=100,它的执行效果也会与您只有 100 个实体相同。

这与表明性能随返回的实体数量而变化的文档一致。

当我说不是很费劲时,我的意思是响应时间到处都是,而且这是一个非常非常粗略的估计。在同一个请求上,我经常会看到性能上有一个数量级的差异。

于 2013-03-06T00:57:51.560 回答
1

AppEngine 以一种非常优化的方式进行查询,因此从性能的角度来看,您是否对 name 属性进行查询与仅使用键进行批处理获取几乎无关紧要。两者都将与返回的实体数量呈线性关系。存储在数据库中的实体总数没有区别。但是,产生微小差异的是数据库中出现的“名称”的不同值的数量(因此,返回的 1000 个实体几乎比返回的 100 个实体慢 10 倍)。

完成此操作的方法是通过与您的数据一起存储的索引(或首选索引)。“名称”属性的索引由一个表组成,该表具有按字母顺序排序的所有名称(如果您在任何查询中使用降序排序,则第二个按字母倒序排序),然后查询将简单地找到您要在表中查询的名称的第一次出现并开始按顺序返回结果。这称为“扫描”。

这个视频有点技术性,但它详细解释了这一切是如何工作的,如果你担心编码以获得最佳性能,可能是一个很好的时间投资:

Google I/O 2008:在 Google App Engine 数据存储的掩护下

(视频质量很差,但他们也有在线幻灯片(见上面的视频链接))

于 2013-03-06T03:30:54.040 回答