缓存动态查询PHP + BigQuery


Cache Dynamic Query PHP + BigQuery

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

我创建了一个PHP程序,从这个数据库中获得许多查询的洞察力,比如每天,每小时的数据统计等等

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

  1. 我试图找到日期在2016-11-01和2016-11-10之间的用户活动数据,然后我只需要分解2016-11-05数据的数据(数据基本上是查询结果的子集)。这些数据需要按天、按小时、按用户类型等进行分类。现在我在数据库中使用许多查询来对这些数据进行分组并进行许多数据操作。例如"SELECT * FROM user_activities WHERE date>='2016-11-01' AND date<='2016-11-10' GROUP BY date,hour",然后当我需要分解2016-11-05中的数据时,我只重新运行查询:"SELECT * FROM user_activities WHERE date='2016-11-05' GROUP BY date,hour"

  2. 或者有时我需要查询不同参数的数据,例如2016-11-01到2016-11-10之间的用户活动包含活动"A",然后我需要更改为活动"B"。我有一列来标识用户所做的活动类型。现在我运行查询,如"SELECT * FROM user_activities WHERE activities like 'A',然后当活动类型改变时,我运行新的查询"SELECT * FROM user_activities WHERE activities like 'B'。

我的问题是:由于数据库中的数据非常大,并且PHP程序中的洞察力查询活动非常频繁,因此数据管理和处理的成本变得非常高。对于第1和第2种情况是否有其他解决方案,如PHP缓存,使数据库请求减少?

在短短1-2天内,我的BigQuery数据请求可以变成tb级的数据。我担心这对我的成本数据库管理来说不是很有效。

到目前为止,我已经尝试了这些解决方案:

  1. 我从数据库中获取原始数据,在PHP上缓存它并运行手动操作数据。例如,我运行"SELECT * FROM"user_activities WHERE date>='2016-11-01' AND date<='2016-11-10'" AND然后我尝试按小时或按组进行数据操作用户类型或组按用户活动手动和顺序PHP函数。但是因为我的数据包含了上百万的数据过程变得如此漫长和低效。
  2. 我从数据库中获取原始数据,将其插入临时表,然后通过对临时表的查询操作数据。但这进程也因为插入进程而变得效率低下百万行数据变得如此长。

你有什么建议我如何优化我的问题吗?

  1. 按照推荐的方式实现分区表。
    如果你有一个大的表,5TB的数据没有分区,你的成本是很高的。当您使用分区表时,您只有那些天的存储空间来查询,而不是整个表。只是其中的一小部分,比如10GB或更小。

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

  3. 尽量不要使用'SELECT *',而只是选择你必须在你的输出列。
  4. 如果数据足够小,并且你对它做了很多小查询,你可能想从BQ中取出并存储在ElasticSearch或MySQL中,并从那里运行查询。