我基本上有一个经典的多对多模型。一个用户,一个奖项,以及连接用户和奖项之间的“多对多”表。
每个用户大约有400个奖项,每个奖项都授予了大约一半的用户。
我想遍历所有用户的奖项并将它们的点数加起来。在 SQL 中,这将是一个多对多的表连接,然后遍历每一行。在拥有 MySQL 实例的良好机器上,400行应该不成问题。
在应用程序引擎上,我看到需要大约10秒钟才能完成求和。大部分时间都花在Google的数据存储中。以下是cProfile的前几行:
ncalls tottime percall cumtime percall filename:lineno(function) 462 6.291 0.014 6.868 0.015 {google3.apphosting.runtime._apphosting_runtime___python__apiproxy.Wait} 913 0.148 0.000 1.437 0.002 datastore.py:524(_FromPb) 8212 0.130 0.000 0.502 0.000 datastore_types.py:1345(FromPropertyPb) 462 0.120 0.000 0.458 0.001 {google3.net.proto._net_proto___parse__python.MergeFromString}
我的数据模型有问题吗?我查询数据库的方式有误吗?这是一个必须通过缓存和批量更新来解决的缺陷(这将非常麻烦)吗?