【问题标题】:Google Cloud Datastore queries too slow when fetching all records获取所有记录时,Google Cloud Datastore 查询速度太慢
【发布时间】:2026-02-15 07:25:03
【问题描述】:

我的 Google Cloud Datastore 查询性能极慢。

我的实体结构很简单:

calendarId, levelId, levelName, levelValue

只有大约 1400 条记录,但查询需要 500ms-1.2 秒才能返回数据。仅针对 313 条记录,对不同实体的另一个查询也需要 300-400 毫秒。

我想知道是什么导致了这种延迟。任何人都可以就如何调试此问题或检查哪些因素提供一些指示?

谢谢。

【问题讨论】:

  • 您是否在查询中设置了块大小?
  • 你能分享一些代码来展示你如何获取数据吗?我们或许可以帮助您优化这些查询。
  • 代码在哪里?
  • @AndreiVolgin 这是一个很好的观点。我们正在使用不使用准备好的查询的 API(在数据存储 API 之上)。这是我们可以使用指定块/预取大小的准备好的查询来检查的。但是我唯一担心的是它是一个只执行一次的查询,所以这些选项可能也不会产生太大影响。感谢您的意见。
  • 默认的块大小是 10,你可以增加到 500。这在获取的数量上是一个很大的差异。

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


【解决方案1】:

您遇到了预期的行为。在向用户展示页面时,您不需要获取那么多实体。 Gmail 不会向您显示 1000 封电子邮件,它会根据您的设置向您显示 25-100 封电子邮件。您应该获取较小的数字(例如,前 100 个)并实现某种分页以允许用户查看其他实体。

如果这是后端处理,那么您将只需要这么多时间来处理实体,您需要考虑到这一点。

请注意,您通常希望大批量获取实体,而不是一个一个地获取,但我假设您已经根据问题中的数字这样做了。

【讨论】:

  • 你是对的,这些表没有太多数据,所以我正在获取所有数据并创建缓存以服务 UI。但这并不是需要一秒钟以上才能检索到的大量数据。这真的是正常行为吗?
  • "在向用户展示页面时,您不需要获取那么多实体" 如果您想使用实时过滤填充面向用户的表格,您可以这样做。否则,当您在将过滤器查询发送到后端等时想要过滤表的行时,一切都会变得迟缓。SQLite 可以在几毫秒内给我 10k 行,为什么数据存储需要 1.5 秒才能达到 1500?
【解决方案2】:

不确定这是否会有所帮助,但您可以尝试使用嵌入式实体将更多数据打包到单个实体中。嵌入式实体不是真正的实体,它们只是允许嵌套数据的属性。因此,不是每个实体有 4 个属性,而是在实体上创建一个数组属性,该属性存储嵌入实体的列表,每个实体都具有这 4 个属性。实体的最大大小为 1MB,因此您需要打包数组以尽可能接近该 1MB 限制。

这将减少真实实体的数量,我怀疑这也会减少整体获取时间。

【讨论】:

  • 实际上数据是非常线性的类型,在这种情况下不能真正嵌入实体。但是我会检查一点:记录数相同但列数减少是否会减少获取时间。
  • 不确定。我想它会因为每个实体的数据会更小。