计算Google Appengine数据存储中特定范围内的实体



我是Google数据存储的新手。我正在构建一个简单的应用程序,我想统计满足特定标准的实体数量。显而易见的方法是首先查询该实体,然后对结果进行计数:

// Applying query on the "height" property of the entity "Person
Filter heightFilter = new FilterPredicate("height",
                  FilterOperator.GREATER_THAN_OR_EQUAL,
                  minHeight);
// Use class Query to assemble a query
Query q = new Query("Person").setFilter(heightFilter);
// Use PreparedQuery interface to retrieve results
PreparedQuery pq = datastore.prepare(q);
// And now count.

我想知道这是否是完成这项特殊任务的最佳方式。查询机制将遍历这个特定实体(本例中为Person)的整个数据库,并逐一匹配它。如果我只需要计数而不是整个实体,有什么更好的方法可以做到这一点吗?

数据库不是为这类查询而设计的,计数很难扩展,因此我们鼓励您为您的特定需求提供解决方案。

在这种情况下,您可以有一个模型为您保留计数,并在每次添加/删除Person时更新它。然后要获得计数,只需获取一个实体并读取计数,这非常适合读取,既快速又便宜。

现在的问题是写入,因为您希望以事务方式执行此操作(以保持准确的计数),所以应用程序中可能会出现每秒更新次数超过1-5次的情况,并且事务需要重试,这可能会成为瓶颈。这一阶段的一个流行解决方案是使用Sharding计数器,它将计数过程分布在多个实体之间,从而提高吞吐量。

我建议你保持简单,只有在你真正需要的时候才使用更先进的技术,以控制复杂性。这项技术(非sql)的理念是在编写时提前支付成本,因此读取尽可能快速高效。

下面的代码片段将只返回键,而不是整个实体,只返回键的查询被视为"小操作",因此既更快又更重要。。。自由的

Query q = new Query("Person").setKeysOnly();

最新更新