缓存动态查询PHP +的BigQuery

问题描述:

我在谷歌的BigQuery一个数据库行的万人(每天超过200万新行)包含了我的用户活动的缓存动态查询PHP +的BigQuery

我创建一个PHP程序,从中得到的见解与许多查询数据库显示像每天的数据统计,每小时还有更多

我有两例二题:

  1. 我试图寻找在2016年最新用户活动数据-11-01和2016-11-10,然后我需要打破只有2016-11-05数据的数据(数据基本上是查询结果的子集)。这些数据需要分类为每天或每小时或每个用户类型等等。现在我在数据库中使用许多查询来分组这些数据并执行许多数据操作。例如“SELECT * FROM user_activities WHERE date> ='2016-11-01'和日期< ='2016-11-10'GROUP BY日期,小时”,然后当我需要在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 activity like'A',然后当活动类型被更改时,我运行新查询”SELECT * FROM user_activities WHERE活动像'B'。

所以我的问题是: 因为在我的数据库中的数据是如此之大,并且因为在我的PHP程序的洞察力查询活动是如此之高的频率,数据管理和处理的成本变得很高。对于案例1和案例2,是否有任何其他解决方案(如PHP缓存)来减少数据库请求?

在短短1-2天内,我的BigQuery数据请求可以成为太字节的数据。恐怕在我的成本数据库管理方面它效率不高。

据我曾尝试以下解决方案:

  1. 我把原始数据从我的数据库,它缓存PHP和手动运行 数据操作。例如,我运行“SELECT * FROM user_activities WHERE date> ='2016-11-01'和日期< ='2016-11-10'”和 然后我尝试按小时或组的方式运行数据操作 用户类型或按用户活动分组手动和按顺序在 PHP函数。但是由于我的数据包含数百万的数据,因此 过程变得如此漫长而且效率不高。
  2. 我从我的数据库中取出原始数据,将它插入临时表, ,然后通过查询操纵数据到临时表。但是这个 进程变得效率不高,因为对于 万行数据的插入过程变得如此之长。

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

+0

我记得我建议你分区表,你有没有实现?您是否可以向我们发布您在1天内查询的费用和大小。还有你每天运行多少个查询。 – Pentium10

+0

Hi @ Pentium10是的,我已经实现了你的分区每天的建议,是的,它工作得很好,以降低成本:)但我有一个新的问题冗余查询请求与小参数不同。根据洞察请求(有几十个查询),查询的成本将变成几乎1TB(这比我实施每日分区的情况要好得多,因为每个洞察可能会花费多TB数据)。而且我需要每天多次致电此洞察。我只是好奇,有没有更多的高级优化,我可以做:) –

+0

向我们展示了表格的模式,并且每天为我们绘制一张图表来记录您是否需要更大的分区。你目前的成本是多少? – Pentium10

  1. 按照您的建议执行Partitioned Tables
    如果您有一个包含5TB数据而无分区的大表,您的成本很高。
    当您执行分区表时,您只有那些日子的存储才能查询整个表。只是其中的一小部分,比如10GB或更小。而你只支付。

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

  3. 尝试不使用'SELECT *',而只是选择输出中必须包含的列。
  4. 如果数据足够小,并且您在其上执行大量小查询,则可能需要从BQ中取出并存储在ElasticSearch或MySQL中,然后从那里运行查询。
+0

嗨,谢谢你的回答。所以有一种方法可以根据我们的查询在大查询中自动创建一个临时表?然后我可以调用临时表进行数据聚合? –

+0

是的,您已经完成的每个查询都正在写入临时表,请检查您的库以获取表的名称。它是匿名的桌子,24小时为您提供,但如果您愿意,您也可以提供一个名字。 – Pentium10

+0

非常感谢你的回答。它非常棒,而且运作得非常好,就像我需要的一样:) –