我們正在開發的應用程序每天要編寫大約4-5百萬行數據。而且,我們需要在過去90天內保存這些數據。存儲舊數據以更快訪問的更好方式
表user_data
具有以下結構(簡化):
id INT PRIMARY AUTOINCREMENT
dt TIMESTAMP CURRENT_TIMESTAMP
user_id varchar(20)
data varchar(20)
關於應用程序:
- 數據是舊超過7天將不會被寫入/更新。
- 數據大多基於
user_id
訪問(即所有查詢將具有WHERE user_id = XXX
) - 目前大約有13000個用戶。
- 用戶仍然可以訪問較舊的數據。但是,在訪問舊數據時,我們可以限制他/她只能獲取全天數據而不是時間範圍。 (例如,如果用戶試圖獲取2016-10-01的數據,他/她將獲取全天的數據,並且無法獲取2016-10-01 13:00 - 2016-10的數據-01 14:00)。
目前,我們正在使用MySQL InnoDB
存儲的最新數據(即7天,較新的),它工作正常,並在innodb_buffer_pool
適合。
至於較舊的數據,我們以user_data_YYYYMMDD
的形式創建了較小的表格。過了一段時間,我們發現這些表格不適合innodb_buffer_pool
,它開始放慢速度。
我們認爲基於日期分離/分片,基於user_ids的分片會更好(即使用基於用戶和日期的較小數據集,例如user_data_[YYYYMMDD]_[USER_ID]
)。這將使桌子保持更小的數量(最多隻有10K左右)。
圍繞研究後,我們發現有出有幾個選項:
- 使用MySQL表每日期的用戶(即
user_data_[YYYYMMDD]_[USER_ID]
)來存儲。 - 使用MongoDB的集合每個
user_data_[YYYYMMDD]_[USER_ID]
- 寫舊數據(JSON編碼)到
[USER_ID]/[YYYYMMDD].txt
最大的騙子我在這看到的是,我們將擁有的表/收藏/文件數量巨大的時候,我們這樣做(即13000 x 90 = 1.170.000)。我想知道我們是否在未來的可擴展性方面接近正確的方式。或者,如果有其他標準化的解決方案。
謝謝,約書亞。一定會嘗試探索更多關於PARTITION的內容。 –