0

我在下面的生产应用搜索页面中附加了 Appstats。该页面需要大约 45 秒才能通过 AJAX 加载结果。大约有 100 个实体。查询如下图:

qry_1 = X.query(ndb.AND(X.active_status=="active", X.property_3==input_3, X.property_4==input_4, X.property_5==input_5, X.property_6.IN(input_6_list), X.property_20.IN(input_20_list))) 
record_list = qry_1.fetch() 

# input_6_list contains ~5 string items 
# input_20_list contains ~5 string items 

我无法弄清楚:
为什么下图中显示的 RPC 调用之间有空格.. 它们意味着什么.. 我如何防止它们,因为它们使我的网站无法使用
为什么查询需要这么长时间才能完成

应用统计时间表

调用跟踪指向我的代码中的以下行:

record_list = qry_1.fetch() 

呼叫跟踪行显示它:

  <path[0]>/main.py:6332 post() 
4

1 回答 1

3

自从你上一个问题以来,情况并没有真正改变。您的数据看起来非常相关。该模型强制查询执行大量索引查找以满足 AND 和 IN 操作。简而言之,当前的模型永远不会扩展。它必须完全重组。

从查询开始创建新结构 - 以最少数量的查询参数和索引查找输出所需数据的最快(换句话说,最简单)的方法是什么?您可以连接所有旧查询参数(属性),对结果进行散列处理,最后使用单个键在单个索引中查找。快速地。然后从那里向后工作以存储您的记录,以便每个属性组合散列到唯一键和相应的结果记录。您必须接受冗余(为不同的属性组合多次存储相同的结果),但这是 NoSQL 方式,而不是第三范式。

在这些 StackOverflow 问题中,还有一些其他可能对重构数据有用的建议:存储歌曲、艺术家和专辑数据以及如何存储文档结构

第二个答案:如果您的数据模型不够灵活,请将 Datastore 替换为Cloud SQL,因为在小型数据集上进行复杂查询会更快。

于 2014-03-12T06:09:42.433 回答