2012-09-02 101 views
0

在開發服務器和生產服務器上使用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作業運行的。

+0

如果您將遊戲中的日期下拉到團隊結果中,那麼您實際上可以獲取與您的日期範圍相匹配的所有遊戲結果。這會讓你的代碼運行得更快。除非你需要更新其他實體。 (仍然值得一試,並且預告團隊等其他事情也會有幫助) –

+0

做一個自底向上的查詢和預取結果集的引用屬性可能真的是一場勝利。 –

回答

2

您的問題是,您將這些記錄逐個

你需要使用批量插入,看到https://developers.google.com/appengine/docs/python/tools/uploadingdata

或者你可能要插入的記錄列表,如文檔描述:

https://developers.google.com/appengine/docs/python/datastore/entities#Batch_Operations

+0

我從用戶上傳的文件插入數據。該文件上傳到blobstore,然後我使用csv.reader來解析它。批量上傳器看起來並不像這樣。 –

+0

查看編輯回答 – jdevelop

+0

我不得不重構模型,但在這之間,使用Memcache作爲Team鍵,並使用批量插入,我獲得了更合理的性能。 –

1

我沒有看到你在你的任何性質的使用indexed=False任何證據。每個這樣的屬性每寫一次就會增加兩個寫入(一個用於升序索引,一個用於降序索引)。這些加起來很快。

+0

你說得對,我沒有使用indexed = False。在可能的情況下添加它會產生很大的不同,謝謝您的建議! –