【发布时间】:2011-07-28 11:55:51
【问题描述】:
我很难为我的应用程序数据建模以获得合理的性能。
这是一个跟踪一群人成本的应用程序,今天我有以下实体:
class Event(db.Model):
# Values
name = db.StringProperty(required=True)
password = db.StringProperty(required=True)
class Person(db.Model):
# References
event = db.ReferenceProperty(Event, required=True)
# Values
name = db.StringProperty(required=True)
class Transaction(db.Model):
# References
event = db.ReferenceProperty(Event, required=True)
paidby = db.ReferenceProperty(Person, required=True)
# Values
description = db.StringProperty(required=True)
amount = db.FloatProperty(required=True)
datetime = db.DateTimeProperty(auto_now_add=True)
# This is used because a transaction might not distribute costs
# evenly across all persons belonging to the event
class TransactionPerson(db.Model):
# References
event = db.ReferenceProperty(Event, required=False)
transaction = db.ReferenceProperty(Transaction, required=True)
person = db.ReferenceProperty(Person, required=True)
# Values
amount = db.FloatProperty(required=True)
问题是,例如,当我想计算每个人的余额时,我必须获取与事件关联的所有数据并循环遍历每个 Transaction/Person 组合的所有 TransactionPerson(在下面的示例中是 ~ 65.000 次操作)
我有一个事件示例:
- 4 人
- 76 笔交易
- 213 交易人
然后向显示每个人的余额摘要和所有交易的起始页面请求:
真实:1863ms cpu:6900ms(实际1769ms) api: 2723ms (94ms real)目前我只执行 3 个 RPC 请求来获取事件的所有人员、事务和事务人员,然后在应用程序中执行所有“关系”工作,这就是 cpu ms 相当高的原因。
问题:
仅从 3 个数据存储请求中获取 293 个对象需要 2723ms api cpu,这不是很高吗?实时还可以(94ms),但是我的api cpu配额占用了很多?
如何设计它以获得更好的性能?对于上面的这个例子,今天的实际 ms 是 1863,但是如果有例如 12 个人,则时间将增加三倍。这些不是可接受的响应时间。
谢谢!
【问题讨论】:
标签: python google-app-engine google-cloud-datastore