2010-01-08 77 views
0

所以我有一個用戶類App Engine的GQL查詢財產範圍

class User(db.Model): 
    points = db.IntegerProperty() 

所以我創建開發服務器上的1000個虛擬實體點範圍從1到1000

query = db.GqlQuery("SELECT * FROM User WHERE points >= 300" 
        "AND points <= 700" 
        "LIMIT 20" 
        "ORDER BY points desc") 

我只想要20每個查詢的結果(足以填充頁面)。我不需要任何分頁結果。

一切看起來不錯,它在發展服務器上工作。

問題:
1.它可以在具有100,000-500,000個用戶實體的生產服務器上工作嗎?我會遇到很大的滯後嗎?我希望不會,因爲我聽說App Engine會自動索引點列
2.您可以推薦的任何其他優化技術?

回答

1

我認爲很難說您會遇到如此衆多的實體會遇到什麼樣的性能問題。這個特定的查詢可能會很好,但您應該知道,數據存儲區查詢不能返回超過1000個實體,因此如果您需要使用大於1000的數字進行操作,則需要批量操作,並且您可能想要將它們分成不同的實體組。

就優化而言,您可能需要考慮緩存此查詢的結果,並僅在知道信息已更改或以特定間隔運行時才運行該查詢。如果查詢是出於某種目的,其中完全正確的結果並非完全關鍵 - 例如,顯示排行榜或高分列表 - 您可能會選擇每小時更新並緩存一次結果,或者類似的結果。

我能想到的唯一的其他優化是,您可以通過一次性保存與解析該GQL語句相關聯的週期,並將結果對象保存在memchache或全局變量中。

+1

緩存GQL對象沒有任何意義 - 解析比酸洗/取消更便宜!但是使用Query接口比GQL稍快。 – 2010-01-11 11:30:40

+0

我不是故意說GQL對象需要被醃製。相反,通過持有它的一個實例,你可以避免在每次請求時都要重新解析它,但如果尼克約翰遜說你不需要打擾,那肯定不會。 – 2010-01-11 14:03:51

1

您的代碼似乎很適合獲得頂級用戶,但更復雜的查詢,比如查明任何特定用戶的排名會很難。如果您也需要這種功能,請查看google-app-engine-ranklist

Ranklist是谷歌App Engine的一個Python庫,用於實現存儲整數 成績和快速檢索自己的 相對行列 數據結構。