缓存动态查询 PHP + BigQuery

Posted

技术标签:

【中文标题】缓存动态查询 PHP + BigQuery【英文标题】:Cache Dynamic Query PHP + BigQuery 【发布时间】:2016-11-17 14:48:49 【问题描述】:

我在 Google BigQuery 中有一个包含我的用户活动的数百万行(每天超过 200 万新行)的数据库

我创建了一个 php 程序来从这个数据库中获取洞察力,其中包含许多查询来显示每天、每小时等数据的统计数据

我有两个案例有两个问题:

    我尝试查找日期在 2016-11-01 和 2016-11-10 之间的用户活动数据,然后我需要仅分解 2016-11-05 数据的数据(数据基本上是查询结果的子集)。这些数据需要每天或每小时或每个用户类型等等进行分类。现在我在数据库中使用许多查询来对这些数据进行分组并进行许多数据操作。例如“SELECT * FROM user_activities WHERE date>='2016-11-01' AND date

    或者有时我需要查询不同参数的数据,例如2016-11-01和2016-11-10之间包含活动“A”的用户活动,然后我需要更改女巫活动“乙”。我有一列来标识用户执行的活动类型。现在我运行类似“SELECT * FROM user_activities WHERE activity like 'A'的查询,然后当活动类型改变时我运行新查询”SELECT * FROM user_activities WHERE activity like 'B'。

所以我的问题是: 因为我的数据库中的数据非常大,而且我的PHP程序中的insight查询活动非常频繁,所以数据管理和处理的成本变得非常高。对于案例 1 和案例 2,是否有任何替代解决方案,例如 PHP 缓存,以使数据库请求变少?

只需 1-2 天,我的 BigQuery 数据请求就可以变成 TB 级数据。恐怕在我的成本数据库管理方面效率不是很高。

目前我已经尝试过这些解决方案:

    我从数据库中获取原始数据,将其缓存在 PHP 上并运行 手动操作数据。例如我运行“SELECT * FROM user_activities WHERE date>='2016-11-01' AND date 我从数据库中获取原始数据,将其插入临时表, 然后通过查询到临时表来操作数据。但是这个 过程也变得效率不高,因为插入过程 百万行数据变得如此之长。

您有什么建议可以优化我的问题吗?

【问题讨论】:

我记得我推荐过分区表,你实现了吗?您能否也向我们发布您 1 天的查询的成本和大小。还有你每天运行多少查询。 嗨@Pentium10 是的,我已经实施了您对每天分区的建议,是的,它可以很好地降低成本:) 但是对于具有小参数不同的冗余查询请求,我遇到了新问题。每个洞察请求(有几十个查询)的查询成本将接近 1TB(这比我实施每日分区之前要好得多,因为每个洞察可能会花费多个 TB 数据)。我需要每天多次调用洞察力。我只是好奇我可以做任何更高级的优化:) 向我们展示表的架构,并为我们制作每天记录数的图表,看看您是否需要更大的分区。您目前达到的成本是多少? 【参考方案1】:

    按照为您推荐的方式实施Partitioned Tables。 如果您有一个包含 5TB 数据且没有分区的大表,那么您的成本会很高。 当你做分区表时,你只有那些天的存储空间来查询整个表。只是其中的一小部分,例如 10GB 或更小。而您只需支付这笔费用。

    您可以将查询结果直接保存到表中,而不是按您说的重新导入,并且只查询较小的表以便进一步聚合。

    尽量不要使用“SELECT *”,而只选择输出中必须包含的列。 如果数据足够小,并且您对其进行了大量小查询,您可能希望从 BQ 中取出并存储在 ElasticSearch 或 mysql 中,然后从那里运行查询。

【讨论】:

您好,感谢您的出色回答。那么有一种方法可以根据我们的查询在大查询中自动创建一个临时表吗?然后我可以调用临时表进行数据聚合? 是的,您已经执行的每个查询都将写入临时表,请检查您的库以获取表的名称。它是 24 小时为您服务的匿名表,但如果您愿意,也可以提供名称。 哇非常感谢您的回答。它太棒了,而且效果很好,就像我需要的一样:)

以上是关于缓存动态查询 PHP + BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中动态查询多个表

使用 bigquery 和 Data Studio 进行动态查询

BigQuery - 基于字段/过滤器构建动态选择语句/查询

Google BigQuery - 从选择语句执行动态生成的查询

BigQuery是否支持“执行立即”命令来运行动态查询?

如何在 Google Bigquery 中创建动态更改数据集的查询?