在開發服務器和生產服務器上使用GAE數據存儲,我看到了糟糕的性能。我有以下簡化模型:GAE數據存儲性能vs SQLite
class Team(db.Model):
name = db.StringProperty()
# + 1 other property
# home_games from Game
# away_games from Game
class Game(db.Model):
date = db.DateProperty()
year = db.IntegerProperty()
home_team = db.ReferenceProperty(Team, collection_name='home_games')
away_team = db.ReferenceProperty(Team, collection_name='away_games')
# + 4 other properties
# results from TeamResults
class TeamResults(db.Model):
game = db.ReferenceProperty(Game, collection_name='results')
location = db.StringProperty(choices=('home', 'away'))
score = db.IntegerProperty()
# + 17 other properties
我只有一個索引,在遊戲的年份和日期。插入478支球隊和786場比賽的小數據集大約需要50秒。一個簡單的查詢:
games = Game.all()
games.filter('year = ', 2000)
games.order('date')
for game in games:
for result in game.results:
# do something with the result
花了大約45秒。
我正在從基於SQLite的數據存儲移動,而上面的查詢在一個更大的數據集上只需要幾分之一秒。我的數據是不是很差?數據存儲就這麼慢嗎?
編輯1
爲了讓多一點背景,我從用戶上載的文件中插入數據。該文件上傳到blobstore,然後我使用csv.reader來解析它。這是定期發生的,並且查詢是基於cron作業運行的。
如果您將遊戲中的日期下拉到團隊結果中,那麼您實際上可以獲取與您的日期範圍相匹配的所有遊戲結果。這會讓你的代碼運行得更快。除非你需要更新其他實體。 (仍然值得一試,並且預告團隊等其他事情也會有幫助) –
做一個自底向上的查詢和預取結果集的引用屬性可能真的是一場勝利。 –