Database-Design
如何處理超過 500M 項目的查詢
我的資料結構如下:
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
- 按
group
orsecond_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 進行過濾/分析。它是基於集群的,您可以根據需要對其進行擴展。