2016-11-17 103 views
1

我在谷歌的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

回答

0
  1. 按照您的建議執行Partitioned Tables
    如果您有一個包含5TB數據而無分區的大表,您的成本很高。
    當您執行分區表時,您只有那些日子的存儲才能查詢整個表。只是其中的一小部分,比如10GB或更小。而你只支付。

  2. 您可以直接將查詢結果保存到表格中,而不是像您說的那樣重新導入,只查詢該表格,以便進一步聚合。

  3. 嘗試不使用'SELECT *',而只是選擇輸出中必須包含的列。
  4. 如果數據足夠小,並且您在其上執行大量小查詢,則可能需要從BQ中取出並存儲在ElasticSearch或MySQL中,然後從那裏運行查詢。
+0

嗨,謝謝你的回答。所以有一種方法可以根據我們的查詢在大查詢中自動創建一個臨時表?然後我可以調用臨時表進行數據聚合? –

+0

是的,您已經完成的每個查詢都正在寫入臨時表,請檢查您的庫以獲取表的名稱。它是匿名的桌子,24小時爲您提供,但如果您願意,您也可以提供一個名字。 – Pentium10

+0

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