2015-04-01 100 views
0

首先,我正在使用MongoDB 3.0和新的WiredTiger存儲引擎。還使用snappy進行壓縮。針對隨機讀取進行優化

我想從技術角度來理解和優化的用例如下;

我有一個相當大的集合,大約有5億個文檔需要大約180 GB(包括索引)。

實施例的文檔:

{ 
    _id: 123234, 
    type: "Car", 
    color: "Blue", 
    description: "bla bla" 
} 

查詢包括與特定字段值查找文檔的。像這樣;

thing.find({ type: "Car" }) 

在這個例子中,type字段顯然應該被索引。到現在爲止還挺好。然而,這個數據的訪問模式將是完全隨機的。在特定時間,我不知道將訪問哪些文檔範圍。我只知道他們將在索引字段中被查詢,一次返回最多100000個文檔。

這意味着在我心中,MongoDB/WiredTiger中的緩存幾乎沒有用處。唯一需要適應緩存的是索引。如果不是不可能的話,對工作集的估計很難?

我在找什麼主要是使用什麼類型的索引以及如何爲這種用例配置MongoDB的技巧。其他數據庫會更好嗎?

目前我發現MongoDB在硬件有限的情況下工作得很好(16 GB RAM,非SSD盤)。如果結果集已經存在於緩存中,查詢將在體面時間內返回,顯然會立即返回。但如前所述,這很可能不是典型的情況。查詢的速度並不是很關鍵,更重要的是它們是可靠的,並且數據庫能夠以穩定的方式運行。

編輯:

想我遺漏了一些重要的事情。數據庫將主要用於存檔目的。因此,數據來自另一個來源,例如每天一次。更新將非常罕見。

我使用的例子有點人爲設計,但實質上這就是查詢的樣子。當我提到多個索引時,我的意思是該例中的typecolor字段。因此,將使用這些字段查詢文檔。現在,我們只關心返回具有特定的所有文檔type,color等等。自然,我們的計劃是隻查詢我們有索引的字段。所以臨時查詢不在桌面上。

現在索引大小非常易於管理。對於5億個文檔,這些索引中的每一個大約爲2.5GB,並且很容易放入RAM中。

關於操作的平均數據大小,我只能在這一點上進行推測。據我所知,典型的操作返回大約20k個文檔,平均對象大小在1200字節範圍內。這是由db.stats()報告的統計數據,所以我想這是針對光盤上的壓縮數據,而不是實際需要多少內存一次。

希望這一點額外的信息幫助!

回答

0

基本上,如果你有一個一致的速度讀取均勻隨機在type(這是我要帶去什麼

我不知道是什麼範圍的文件將被訪問

表示),那麼您將看到數據庫中的穩定性能。它會從緩存中讀取一定比例的讀取數據,只是祝你好運,另一個穩定的比例是從磁盤讀取數據,特別是如果文檔的數量和大小在不同的type值之間大致相同。我不認爲有一個特殊的索引或任何東西來幫助你,除了更好的硬件。索引應該保留在RAM中,因爲它們會不斷被使用。

我想更多的信息會有所幫助,因爲你只提到一個簡單的查詢type,但後來談論有多個索引擔心保留在RAM中。平均操作返回多少數據?你有沒有關心返回某些type的文檔的子集,或只有所有的文檔?插入和更新此集合的外觀如何?

另外,如果正在讀取的文檔在數據集中是真正完全隨機的,那麼工作集就是所有數據。