Database-Recommendation

用於儲存簡單時間戳值的數據庫

  • September 16, 2014

我在數據庫方面沒有太多經驗,但我需要盡我所能做到這一點。比較具體。

數據庫將只包含如下結構的數據:dataID-timestamp-value

值可以是任何數據類型。每小時將有多達 2000 萬個新條目。讀取查詢總是會在特定時間段內尋找一個或幾個 dataID,即 - 昨天 12:00 - 13:00 或類似的時間。而且這些查詢需要在相對較弱的硬體上快速。如果空間不足,可以覆蓋舊數據。

我願意接受任何建議,sql、nosql 等等。

謝謝你。

我為類似的場景(攝取日誌)測試了幾個數據庫,MongoDB 似乎非常有用。

我使用了以下集合:

db.createCollection("apache", {capped: true, size: 10000000000});

似乎一旦集合被封頂,它就不再增長了。

現在有一個棘手的部分 - 檢索數據。如果需要查詢時間段,則需要索引。如果您添加索引,它仍然會被封頂(例如,無需在封頂集合上壓縮索引 - 我剛剛測試過),您將能夠非常快速地檢索數據。

然而,隨著集合被填滿,插入性能會下降,但隨著索引不增長,它會變得有點穩定。我認為最好限制線上行數,或者將其拆分為多個集合。我只是測試最新版本以查看它的行為方式(選擇多個集合,同時僅插入一個集合)。

在 MongoDB 中,_id 欄位有預設索引(包括上限集合,即使文件另有說明,可能已經過時了),其中包含時間戳並且可用,例如,您可以使用此欄位/索引來選擇時間段但是,如果您還想使用值,我認為最好只為該值添加另一個索引。您還可以嘗試對時間戳和值進行複合索引,總體上會佔用更多空間,但可能會更快。

我測試了其他幾個後端,問題是您需要使用索引,因此在清理表時會鎖定它們。DB2 可以線上執行此操作,但您仍然需要執行此操作(回收可用空間)。所以 DB2 將是第二個選項,因為 MySQL 和 PostgreSQL 在空間回收期間鎖定表。Cassandra 似乎對於這項任務來說是過分的,因為它是寬列儲存。SQL 數據庫也太過分了,因為它們是事務性數據庫。

此外,我在 PHP 上遇到了一些性能問題,可能是由於建構中的一些錯誤,在 PHP 驅動程序中,或者可能只是連接緩慢(它是 PHP/CGI)。現在我正在使用具有永久連接的 Groovy/Tomcat,它的速度要快得多,而且我還使用了比看起來快兩倍的批量插入。

此外,Atom 是非常慢的 CPU。I/O 成本可能存在問題。在 HDD 上啟用 Write-Back 記憶體並使用盡可能多的 RAM 以及調整 I/O 調度程序(使用 noop 或截止日期對其進行測試)並確保這些 Atom 以最大頻率執行非常重要。執行 64 位核心並使用 ulimit 將虛擬記憶體大小設置為無限制也非常重要,因為 Mongo 需要它來處理 2GB 以上的文件(某些系統對最大虛擬記憶體大小有限制,例如 SLES)。Centos7 似乎也表現得非常好(它非常快),所以這也會有所幫助。

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