Database-Design

如何處理超過 500M 項目的查詢

  • August 30, 2016

我的資料結構如下:

date: <timestamp>
filter_a: <integer> -> range [0, 1000]
filter_b: <integer> -> range [0, 1000]
filter_c: <integer> -> range [0, 86400]
filter_d: <integer> -> range [0, 6]
group: <string>
second_group: <integer>
variable_a: <float>
variable_b: <float>
variable_c: <float>
a couple more no very important

我需要執行以下查詢:

第一的:

  • date按, filter_a,filter_b等過濾filter_c數據

其次,使用過濾後的數據:

  • 統計所有記錄
  • 平均,和_ variable_a_variable_b``variable_c
  • 得到的標準差,並且variable_a``variable_b``variable_c
  • 得到的四分位數 ,並且variable_a``variable_b``variable_c
  • grouporsecond_group和聚合(計數、平均、標準、..)對數據進行分組

系統的使用者數量大約是 10 或 15 個,但項目數量巨大,現在是70M ,但幾週後將達到500M,大約一年後將達到1000M 。

查詢的數量很少,並髮使用者不超過10個,我的問題是如何處理這些海量數據的查詢。

到目前為止我嘗試了什麼?

  • 我從 開始mongodb,一開始它很快,但在計算 10M+ 的四分位數時變得很慢。當我添加索引時它有所改善,但當我必須查詢所有數據時它並沒有太大幫助。我開始使用 mongodb 是因為數據非常動態,但幸運的是數據格式“不會再改變”。
  • 正如可以看到的節點一樣,我嘗試filter_a了. 我非常喜歡neo4j,但我的圖表有很多邊,所以查詢不是很快。filter_b``neo4j
  • 最後,由於數據格式不會改變,而且它只是一個集合/表,所以不需要在 SQL 中連接,我檢查了 postgresql。使用 postgresql 我的測試速度更快,但我擔心它將來無法正常擴展。

我需要什麼?

  • 對於這種情況,postgresql 是一個不錯的選擇嗎?
  • 我可以使用另一種數據庫嗎?哪一個最適合這種情況?
  • 我還能做些什麼來改進它?

編輯

  • 每天插入大約 1M 的元素,並且“不應該改變”。
  • 寫入速度並不重要
  • 硬性要求是快速閱讀/聚合

謝謝!

我建議您將這種數學和後處理工作從數據庫移到客戶端應用程序中,而不是依靠關係數據庫對時間序列數據執行這些統計計算。

使用 Python 或 Ruby 等腳本語言,您可以通過在固定寬度的時間段內查詢數據“塊”來增量解決問題,計算中間統計摘要,然後在循環時跨多個塊組合結果在整個歷史上。一些統計度量很難跨塊組合,但是像 Avg() 這樣的東西只需要每個塊的 sum() 和 count(),O(1) vs. O(chunksize),所以塊合併可以很好地擴展。

由於您的數據不會更改,並且只是附加,因此我會將數據儲存在您喜歡的任何地方;例如 Amazon S3,但任何快速讀取的數據庫都可以。沒有索引。您選擇的數據庫/FS 應該可以選擇讀取儲存桶中的數據:例如,您可以每天擁有一個包含 1M 記錄的文件。

然後我會使用 Spark 進行過濾/分析。它是基於集群的,您可以根據需要對其進行擴展。

引用自:https://dba.stackexchange.com/questions/147676