版本1
class ActionLog(db.Model):
action = db.StringProperty()
time_slice = db.IntegerProperty()
trace_code = db.StringProperty() # which profile this log belong to
# Who
facebook_id = db.StringProperty() # the user's facebook id
ip = db.StringProperty() # the user's ip address
# When
time = db.DateTimeProperty(auto_now_add=True) # the time of this event
# What
url = db.StringProperty() # the imgurl
secret = db.StringProperty() # the secret of imgurl instance
tag = db.StringProperty() # the tag
referurl = db.StringProperty() # the tag's link
# Where
weburl = db.StringProperty() # the user's refer url
domain = db.StringProperty() # the refer url's domain
BSP = db.StringProperty() # the refer url's BSP
#execute
log = ActionLog(action=action,
trace_code=trace_code,
facebook_id=facebook_id,
ip=ip,
time_slice=time_slice,
url=url,
secret=secret,
tag=tag,
referurl=referurl,
weburl=weburl,
domain=domain,
BSP=BSP)
db.put(log)
第2版
class ActionLog(db.Model):
trace_code = db.StringProperty()
url = db.StringProperty()
secret = db.StringProperty()
# use a dict like text property to store all implicit properties.
desp = MyDictProperty()
time = db.DateTimeProperty(auto_now_add=True) # the time of this event
#execute
log = ActionLog(
secret = secret,
url = url,
trace_code = trace_code,
desp = {
'action':action,
'facebook_id':facebook_id,
'ip':ip,
'tag':tag,
'referurl':referurl,
'weburl':weburl,
}
)
db.put(log)
这两个版本的代码基本上执行相同的任务,但是,版本1代码将使用超过800毫秒来在谷歌应用引擎上执行简单的放置操作(黄色或红灯)CPU时间。在合同中,版本2代码仅使用大约300毫秒。 (两者都在HRD数据存储上进行测试)
在M / S数据存储上,版本1代码将使用大约400毫秒,版本2代码将使用大约150毫秒。
我可以想象版本1与版本2相比会更慢,因为它使用更多的键索引。但是,很难相信这种差异是如此巨大。谷歌应用程序引擎无法处理如此简单的任务也令人惊讶。
这是否意味着我们不能指望GAE对具有10个以上属性的数据执行插入操作 还是我误解了什么?
THX
答案 0 :(得分:1)
在您不需要编入索引的所有属性上设置index=False
(即,您不会在查询中使用的属性)。这减少了保存实体所需的索引写入次数。
请参阅http://code.google.com/appengine/docs/python/datastore/queries.html#Introduction_to_Indexes以获取解释。
答案 1 :(得分:1)
你的第一个模型有13个索引属性,而你的第二个模型只有5个。第一个模型需要更多时间也不足为奇 - 你可以通过将属性设置为无索引来减少它,正如Dave建议的那样。
这是否意味着我们不能指望GAE对数据执行插入 超过10个属性还是我误解了什么?
App Engine可以很好地执行插入 - 你只需要做好准备就可以花更多的时间和更多的操作。