【问题标题】:GAE Appstats RPC Timeline graph shows long delays with complex NDB queriesGAE Appstats RPC 时间线图显示复杂 NDB 查询的长时间延迟
【发布时间】:2014-03-11 14:48:48
【问题描述】:

我已从下面的生产应用搜索页面附加了 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() 

【问题讨论】:

  • 你的模型是什么样的?反序列化它们可能需要很长时间。
  • @Greg 我的模型显示在another question 中,我问过.. 你能看看there,因为把它放在这里会占用很多空间..

标签: python google-app-engine app-engine-ndb appstats


【解决方案1】:

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

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

在这些 StackOverflow 问题中,还有一些其他可能对重构数据有用的建议:Storing song, artist and album dataHow to store document structure

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

【讨论】:

  • 感谢您的回复.. 我浏览了链接的问题.. 我做了更多分析,并认为我实际上可能达到了每秒 1 次写入的限制.. 我已经问了另一个问题使用我的代码的简化版本.. 我知道我问了太多相关问题,但我觉得 this one 的方向不同..
  • 谢谢..我已经连接并优化了整个模型..你是对的..我应该从查询端而不是我的数据的最佳结构开始..我缺乏经验..
  • 我很高兴你能从一个完全不同的角度来看待这个问题:-)
猜你喜欢
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
相关资源
最近更新 更多