簡體   English   中英

使用c#api,Mongo Db記錄檢索速度非常慢

[英]Mongo Db records retrieval very slow using c# api

我試圖從MongoDb中檢索100000個docouments,如下所示,並且需要很長時間才能返回集合。

var query = Query.EQ("Status", "E");
var items = collection.Find(query).SetLimit(100000).ToList();

要么

var query = Query.GT("_id", idValue);
var items = collection.Find(query).SetLimit(100000).ToList();

說明:

{
    "cursor" : "BtreeCursor _id_", 
    "nscanned" : 1, 
    "nscannedObjects" :1, 
    "n" : 1, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0,
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : 
        {
            "_id" :[[ObjectId("4f79a64eca98b5fc0e5ae35a"),
                ObjectId("4f79a64eca98b5fc0e5ae35a")]]
        } 
}

任何提高查詢性能的建議。 我的桌子有200萬份文件。

-Venkat

Google網上論壇也提出了這個問題:

https://groups.google.com/forum/?fromgroups#!topicsearchin/mongodb-user/100000/mongodb-user/a6FHFp5aOnA

當我回答谷歌小組的問題時,我試圖重現這一點並且無法觀察到任何緩慢。 我能夠在2-3秒內讀取100,000個文檔,具體取決於文檔是在接近開頭還是接近結尾(因為我沒有創建索引)。

我對Google群組問題的回答有更多詳細信息,以及我過去嘗試重現的測試程序的鏈接。

鑒於您提供的信息,我最好的猜測是您的文檔大小太大,延遲不一定在mongo服務器上,而是在將結果集傳輸回您的應用程序機器上。 看看你的avg文檔大小,你有大型嵌入式陣列嗎?

比較使用.SetFields方法僅選擇一個字段時的響應時間(請參閱此處的示例如何使用C#MongoDB驅動程序檢索字段子集? )。 如果響應時間明顯加快,那么您就知道這是問題所在。

有幾件事需要檢查:

  1. 您的查詢是否正確編入索引
  2. 如果您的查詢被編入索引,那么數據本身在內存中的幾率是多少? 如果你有20GB的數據和4GB的RAM,那么你的大部分數據都不在內存中,這意味着你的磁盤正在做很多工作。
  3. 100k文件代表多少數據? 如果您的文檔非常大,他們可能會吸收所有可用的磁盤IO或可能是網絡? 您是否有足夠的空間將其存儲在客戶端的RAM中?

您可以使用iostat常見的linux工具 )或perfmon (在Windows下)檢查磁盤使用情況。 如果在查詢運行時運行這些,則應該了解磁盤發生的情況。

否則,您將不得不做一些關於這里有多少數據移動的推理。 通常,返回100k對象的查詢並不是非常快(不是在MongoDB或SQL中)。 這比人類通常在一個屏幕上消耗的數據更多,因此您可能希望制作更小的批次並讀取10k個對象10次而不是100k對象一次。

如果不為集合創建索引,MongoDB將執行全表掃描 - 這是最慢的方法。

您可以為查詢運行explain() 說明將告訴您哪些索引(如果有)用於查詢,掃描文檔的數量和總查詢持續時間。

如果您的查詢命中所有索引並且執行速度仍然很慢,那么您可能會遇到集合/ RAM大小的問題。

當集合數據+索引適合內存時,MongoDB是最快的。 如果您的集合大小大於可用RAM,則性能下降非常大。

您可以使用totalSize()totalIndexSize()validate() (這些是shell命令)檢查集合的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM