如果我有一个带有索引属性的实体,比如“name”,那么该属性上的==查询的性能会是什么样的?
当然,我知道没有确切的答案是可能的,但性能如何与某些x的name == x
,数据存储区中的实体总数等实体的总数相关联?
如果我有1000个名称等于x的实体,而不是100个实体,name == x
上的查询会慢多少?有没有对此进行任何基准测试?
答案 0 :(得分:2)
我的一些不那么费力的测试表明响应时间与返回的结果数量大致呈线性增加。请注意,即使您有1000个实体,如果您向查询添加限制= 100,它的执行方式也就像您只有100个实体一样。
这与文档一致,表明perf随返回的实体数量而变化。
当我说不是非常费劲的时候,我的意思是响应时间到处都是,并且这是一个非常粗略的估计来画一条线。我经常在同一请求中看到perf的数量级差异。
答案 1 :(得分:1)
AppEngine以非常优化的方式进行查询,因此,无论您是对名称属性进行查询还是仅使用密钥进行批量获取,从性能角度来看几乎无关紧要。返回的实体数量都是线性的。存储在数据库中的实体总数没有区别。但是,产生微小差别的是数据库中出现的“名称”的不同值的数量(因此,返回的1000个实体将比返回的100个实体慢10倍)。
这样做的方法是通过与数据一起存储的索引(或首选索引)。 “name”属性的索引包含一个表,该表具有按字母顺序排序的所有名称(如果在任何查询中使用降序,则第二个按反向字母顺序排序),然后查询将只查找首次出现您在表中查询的名称,并按顺序开始返回结果。这称为“扫描”。
此视频有点技术性,但它详细解释了所有这些是如何工作的,如果您担心编码以获得最佳性能,则可能是投资的好时机:
Google I/O 2008: Under the Covers of the Google App Engine Datastore
(视频质量非常差,但他们也有在线幻灯片(请参阅视频上方的链接))