在聽到MongoDB性能的諸多好消息之後,我們決定讓Mongodb嘗試解決我們遇到的問題。我開始將我們在多個mysql數據庫中的所有記錄移動到mongodb中的單個集合中。這導致收集了29百萬個文件(其中每個文件至少有20個字段),這需要大約100 GB的空間。我們決定將它們全部放在一個集合中,因爲所有文檔具有相同的結構,並且我們要查詢並彙總所有這些文檔的結果。MongoDB在聚合查詢方面的表現
我創建了一些索引來匹配我的查詢,否則即使簡單count()也需要很長時間。但是,諸如distinct()和group()之類的查詢仍然需要很長時間。
實施例:
// creation of a compound index
db.collection.ensureIndex({'metadata.system':1, 'metadata.company':1})
// query to get all the combinations companies and systems
db.collection.group({key: { 'metadata.system':true, 'metadata.company':true }, reduce: function(obj,prev) {}, initial: {} });
我把一看的mongod日誌和它有很多這樣的線(在執行上述查詢):
Thu Apr 8 14:40:05 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {} bytes:1048890 nreturned:417 154ms
Thu Apr 8 14:40:08 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {} bytes:1050205 nreturned:414 430ms
Thu Apr 8 14:40:18 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {} bytes:1049748 nreturned:201 130ms
Thu Apr 8 14:40:27 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {} bytes:1051925 nreturned:221 118ms
Thu Apr 8 14:40:30 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {} bytes:1053096 nreturned:250 164ms
...
Thu Apr 8 15:04:18 query database.$cmd ntoreturn:1 command reslen:4130 1475894ms
此查詢了1475894ms其比我想象的要長(結果列表大約有60個條目)。首先,鑑於我收藏的大量文件,這是否是預期的?一般來說聚合查詢在MongoDB中會如此緩慢?關於如何改善表現的任何想法?
我正在一臺雙核和10GB內存的單機上運行mongod。
謝謝。
那麼這個問題太老了,當你搜索MongoDB聚合框架時,仍然會涉及搜索引擎。馬里奧你沒有提到你的MongoDB版本,因爲他們在2.4中改進了很多AF,而且我在一個蹩腳的m1上做了這個。 EC2與3.7G內存在一個69米的集合,它的速度比以前更快。你有沒有嘗試過新版本,或者你有不同的方法?當然,AF和MapReduce有很多基準,但看看10Gen的最新版本http://blog.mongodb.org/post/62900213496/qaing-new-code-with-mms-map-reduce-vs -aggregation tnx – Maziyar 2013-11-03 02:16:08
感謝您的評論。這是在2010年,我相信我們正在使用MongoDB 1.4.0之類的東西。已經有一段時間了,我相信很多事情在MongoDB中都有變化,但自那年晚些時候以來我一直沒有在這個項目中工作:) – 2013-11-05 17:34:54
感謝Mario的回覆。我剛開始使用MongoDB(大約一年),只是想知道你的項目發生了什麼。無論如何祝你好運:) – Maziyar 2013-11-06 03:19:07