[英]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網上論壇也提出了這個問題:
當我回答谷歌小組的問題時,我試圖重現這一點並且無法觀察到任何緩慢。 我能夠在2-3秒內讀取100,000個文檔,具體取決於文檔是在接近開頭還是接近結尾(因為我沒有創建索引)。
我對Google群組問題的回答有更多詳細信息,以及我過去嘗試重現的測試程序的鏈接。
鑒於您提供的信息,我最好的猜測是您的文檔大小太大,延遲不一定在mongo服務器上,而是在將結果集傳輸回您的應用程序機器上。 看看你的avg文檔大小,你有大型嵌入式陣列嗎?
比較使用.SetFields方法僅選擇一個字段時的響應時間(請參閱此處的示例如何使用C#MongoDB驅動程序檢索字段子集? )。 如果響應時間明顯加快,那么您就知道這是問題所在。
有幾件事需要檢查:
您可以使用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.