簡體   English   中英

查詢在大型MongoDB數據庫上運行非常慢

[英]Query running very slow on big MongoDB db

我有一個MongoDB數據庫,它具有一個相當大的文檔集合(13GB約200萬個文檔)坐在具有8GB RAM的單個服務器上。 每個文檔都有一個相對較大的文本字段(可以是整個博客文章),其他字段是有關文本內容和文本作者的數據。 架構如下所示:

{
    text: "Last night there was a storm in San Francisco...",
    author: {
        name: "Firstname Lastname",
        website_url: "http://..."
    },
    date: "201403075612",
    language: "en",
    concepts: [
        {name: "WeatherConcept", hit: "storm", start: 23, stop: 28},
        {name: "LocationConcept", hit: "San Francisco", start: 32, stop: 45}
    ],
    location: "us",
    coordinates: []
}

我打算以不同的方式查詢數據:

  1. 在“文本”字段上進行全文搜索。 假設我的文字搜尋查詢是q:

     db.coll.aggregate([ { $match:{ $text: { $search:q } } } ]) 
  2. 按作者匯總文件:

     db.coll.aggregate([ { $project: { name: "$author.name", url: "$author.website_url" } }, { $group: { _id: "$name", size: { $sum:1 }, url: { $first: "$url" } } }, { $sort:{ size:-1 } } ]) 
  3. 按概念匯總文檔:

     db.coll.aggregate([ { $unwind: "$concepts" }, { $group: { _id: "$concepts.name", size: { $sum:1 } } }, { $sort:{ size:-1 } } ]) 

這三個查詢還可能包括對以下字段的過濾:日期,位置,坐標,語言,作者。

我還沒有索引,所以查詢運行非常慢。 但是由於索引對我訪問數據的不同方式會有很大不同,這是否排除索引作為解決方案? 還是有一種方法可以為所有這些情況建立索引,而不必將集合分片? 基本上我的問題是:

  • 在這種情況下,什么是好的索引策略?
  • 我需要為作者和概念創建單獨的集合嗎?
  • 我應該以某種方式重組我的數據嗎?
  • 我需要分片收集還是我的8GB單服務器功能強大到足以處理這些數據?

您的收藏夾上有索引嗎?

看看以下

http://docs.mongodb.org/manual/indexes/

如果您有索引,請執行以下操作以確保它們被命中

db.CollectionName.find({"Concept":"something"}).explain();

您還需要向我們提供有關您的設置的更多信息。 服務器有多少RAM? 我曾使用過一個MongoDB,該數據庫具有200GB的3個分區。 因此1上的13GB應該不是問題

暫無
暫無

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

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