插入到 BigQuery 的速度——这应该在后台进行批处理吗?

Speed of inserting to BigQuery - should this be batched in background?

我有一个简单的 URL 缩短器 (PHP),我在其中跟踪点击次数。每次点击都作为单独的行保存到数据库(mysql 当前),因为我还需要有关设备、国家/地区等的信息。

它很好用,但是当 table 越来越大时,查询变得很慢,所以我想迁移到 BigQuery(我知道它们在很多方面都不一样,但我认为这是我需要的东西?)。

我知道在 BigQuery 中选择可能需要几秒钟。但是 - 我找不到插入速度有多快的信息?我可以像传统数据库一样使用它吗 enter -> save click to DB -> redirect url -> exit process 或此插入也很慢,我需要开发(或为此使用一些现有的 solution/service)一些东西来延迟插入或使用 BigQuery 中的 batch/streaming 功能一次插入多个(我有很难理解它的目的)。可能是 enter -> put visit to Redis cache -> redirect -> exit 然后将其作为单独的作业保存到数据库?

您可以检查 quota policy 以获取流式插入。默认情况下,如果未填充 insertID,BigQuery 流插入允许每个项目每秒 1GB。使用 insertId,它将在美国和欧盟多区域中为每个项目提供每秒 500,000 行的默认限制。 BigQuery doc 建议,如果您有一个实时收集大量数据的应用程序,流式插入可能是一个不错的选择。

BigQuery 插入的速度取决于许多动态因素,并且没有关于速度的基准信息。您可以 运行 自己进行测试以找出适合您的环境的速度。总的来说,BigQuery streaming insert 是针对小型实时数据更新的,轻量级,速度快。另一方面,Batch 或 Load 接受文件上传,它适用于更大更重的更新。您需要将所有新行保存在一个文件中,然后将该文件上传到 BigQuery。

关于你的第二个问题,需要在速度和音量之间进行权衡。根据您的要求,您可以选择选项或混合选项。 最好 运行 进行测试以找出最适合您的环境的选项。如果您在 app flow 中执行此操作,则更新是实时的,但由于配额限制,您可能无法进行太多更新。如果您在后台执行此操作,则更新的实时性较低,但您可以利用批量上传的优势并将更多行插入 BigQuery。