簡體   English   中英

在App Engine中查詢Data Store的最有效方法

[英]Most efficient way to query Data Store in App Engine

我有一個數據存儲,其中包含大約150,000個實體。 當我使用過濾器查詢商店時,我的查詢真的很慢。 我的結構是完全平坦的,即每個實體都是彼此的兄弟。

1:使用GQL代替過濾器更好嗎?

2:這不是Data Store的最佳用例,我應該使用SQL數據庫嗎?

這是我的代碼示例:

// Look for a buy opportunity
dateFilter = new FilterPredicate("date", FilterOperator.EQUAL, dt);
scoreFilter = new FilterPredicate("score", FilterOperator.LESS_THAN_OR_EQUAL, 10.0);
safetyFilter = new FilterPredicate("score", FilterOperator.GREATER_THAN_OR_EQUAL, -1.0);
mainFilter = CompositeFilterOperator.and(dateFilter,scoreFilter,safetyFilter);
q = new Query("StockEntity",stockKey).setFilter(mainFilter);
q.addSort("score", Query.SortDirection.ASCENDING);

stocks = datastore.prepare(q).asList(FetchOptions.Builder.withLimit(availableSlots));

更多細節:

  1. 150,000個記錄,分為500個股票,每個股票約300個記錄,日期范圍內每天一個。

  2. 如上所述查詢,其中傳遞了特定日期,並且基於“得分”有效地過濾了500個股票,期望返回的記錄數量在10到20之間需要超過30秒才能完成,在我的開發機器。

還沒有嘗試推動生產,但我想我會嘗試下一步 - 我認為不會有巨大的差異。 我的開發機器是一個相當高的規格iMac。

https://developers.google.com/appengine/docs/java/datastore/queries#Java_Restrictions_on_queries

不等式過濾器最多只能限制一個屬性

為了避免必須掃描整個索引表,查詢機制依賴於所有查詢的潛在結果在索引中彼此相鄰。 為了滿足此約束,單個查詢可能不會在其所有過濾器上的多個屬性上使用不等式比較(LESS_THAN,LESS_THAN_OR_EQUAL,GREATER_THAN,GREATER_THAN_OR_EQUAL,NOT_EQUAL)。 例如,以下查詢有效,因為兩個不等式過濾器都適用於同一屬性:

簡短的回答是你真的無法用數據存儲做你想做的事。

首先,該查詢將在實際數據存儲上運行得更快。

  1. 使用GQL或過濾器基本相同。

  2. 使用數據存儲區時,首先應定義所需的功能。 例如:您想要顯示具有特定訂單和過濾器的股票列表。 現在查看您的應用所需的相同數據的任何其他視圖。 然后決定如何構建數據。

這與RDBMS非常不同,在RDBMS中,數據庫通常可以容納大多數功能而無需更改數據模型,並且數據以更“通用”的方式建模(規范化)。

通常,如果您知道要讀取的任何內容的KEY,那么數據存儲區的讀取性能將是最佳的,並且在執行查詢時它將執行最差的操作,因為它始終需要索引“掃描”。

知道了這一點,我傾向於經常使用祖先的關系。 要求祖先的“孩子”似乎表現得更好並且是一致的。 例如,我使用如下查詢:

SELECT * WHERE ANCESTOR IS {key}

其中{key}是祖先(或“父”)的關鍵。 此查詢返回祖先實體以及在其路徑中具有此祖先鍵的所有實體。 在極少數情況下,我使用其中一個過濾器作為父“值”來對對象進行分組但要小心,一旦寫入實體,密鑰就不會改變(您可以更改密鑰,但會產生副本)。

此外,如果你知道'集'的平均大小。 例如,屬於訂單的訂單行。 您可以選擇在某處跟蹤每個Orderline鍵。 在批量讀取中請求前20個鍵是快速操作。 這與索引基本相同,但是排序和過濾可以在“寫入時間”完成,因此您的列表僅包含與過濾器匹配的鍵。

避免創建允許用戶“動態”選擇過濾器的視圖。

如何進一步優化:1。使用非規范化來最小化查找或查詢的數量。 2.盡可能緩存(Memcache)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM