java - 从数据存储中检索实体的时间

标签 java google-app-engine google-cloud-datastore

我有一个使用数据存储区的 App Engine 应用程序。数据存储区中的其中一种包含 超过 2,000,000 个实体。此类查询非常慢。
例如,返回大约 50 个实体的查询需要 3 - 5 秒。我不知道过滤器的数量是否重要,但在这种情况下,我在查询中设置了 7 个过滤器。
我认为其他类型的查询也很慢。例如查询返回大约 20 来自包含超过 90 000 个实体的 kind 的实体大约需要 1 秒。

我为该查询构建了复合索引,但它没有太大帮助。改变 block 大小和仅使用键查询也没有帮助。

什么对数据存储执行查询的时间影响最大​​? 有什么方法可以加快我的查询速度吗?

我检索实体的方式与我在文档中找到的示例类似:

Query q = new Query("Person").setFilter(heightRangeFilter);

    PreparedQuery pq = datastore.prepare(q);

    for (Entity result : pq.asIterable()) {

      String firstName = result.getProperty("firstName").toString();
      String lastName = result.getProperty("lastName").toString();
      Long height = (Long) result.getProperty("height");

    }

该实体的总大小为 423.33 MB,内置索引:2.87GB,复合索引:1.85GB

我正在使用 Logger 类来记录诊断信息。我可以在管理控制台中看到两个日志之间的时间差。 当我将 log 放入迭代实体的循环的第一行和最后一行时,我可以看到迭代之间出现奇怪的暂停。我不知道这是什么原因。

示例:
15:06:30.565 开始
15:06:30.566 停止
15:06:30.566 开始
15:06:30.566 停止
15:06:30.572 开始
15:06:30.572 停止
15:06:30.583 开始
15:06:30.583 停止
15:06:30.595 开始
15:06:30.595 停止
15:06:30.595 开始
15:06:30.595 停止
15:06:30.595 开始
15:06:30.596 停止
15:06:30.658 开始
15:06:30.658 停止
15:06:30.659 开始
15:06:30.659 停止
15:06:30.666 开始
15:06:30.666 停止
...

编辑: 我修改了查询以使用 6 个过滤器并为其构建新的复合索引。它看起来更快,但在检索大约 100 个实体时仍然运行超过 2 秒。 我创建过滤器的方式类似于文档中的示例:

Filter timeMinFilter =
  new FilterPredicate("time",
                      FilterOperator.GREATER_THAN_OR_EQUAL,
                      startTime);

Filter timeMaxFilter =
  new FilterPredicate("time",
                      FilterOperator.LESS_THAN_OR_EQUAL,
                      stopTime);

Filter heightRangeFilter = CompositeFilterOperator.and(timeMinFilter, timeMaxFilter);

我在字符串属性上设置 FilterOperator.GREATER_THAN_OR_EQUAL 和 FilterOperator.LESS_THAN 重要吗?

感谢您的帮助。

最佳答案

App Engine 上的查询速度不取决于数据存储区中存储的实体数量。它仅取决于您从查询中检索的实体的数量和大小。

您的查询时间表明您检索这些实体的方式存在问题。这可能是用于运行查询的代码存在问题,也可能是创建实体的方式存在问题。无法根据您在问题中提供的信息进行更深入的挖掘。

更新:

尝试改用此代码,看看是否有改进:

for (Entity result : pq.asList(FetchOptions.Builder.withDefaults().chunkSize(100).prefetchSize(100)) { 

每次当您预计查询结果超过 10 个时,您都应该使用此行。请注意,该数字可以是 0 到 1000 之间的任意值,因此您可以针对不同的查询尝试不同的限制,看看哪种效果最好。

关于java - 从数据存储中检索实体的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724047/

相关文章:

java - spring中的数组依赖注入(inject)?

java - LocaleChangeInterceptor 中 Autowiring 身份验证以将 lang 存储在数据库中不起作用

google-app-engine - Google App Engine 中生产和测试环境的最佳实践

google-app-engine - 使用 != 不等于形成 GQL 查询

java - 数据存储键按给定键的排序顺序查询

java - 选择什么 Java Web 框架?

Teiid Excel 数据源的 java.nio.channels.OverlappingFileLockException

python - 从终端测试 Google App Engine 应用程序(python cli)

java - 防止 Google App Engine 中的 get_serving_url() 热链接

google-app-engine - 如何从数据存储中获取 ID 以更新实体?