Lau*_*ney 6 java google-app-engine google-cloud-datastore
我有一个数据存储,其中包含大约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));
Run Code Online (Sandbox Code Playgroud)
更多细节:
150,000个记录,分为500个股票,每个股票约300个记录,日期范围内每天一个.
如上所述查询,其中传递了特定日期,并且基于"得分"有效地过滤了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)。例如,以下查询是有效的,因为两个不等式过滤器都适用于同一属性:
简短的回答是,您确实无法通过数据存储完成您想要的事情。
| 归档时间: |
|
| 查看次数: |
1157 次 |
| 最近记录: |