查询在大型MongoDB数据库上运行速度非常慢

时间:2014-04-17 13:22:03

标签: mongodb

我有一个MongoDB数据库,它有一个相当大的文档集合(13GB,大约2M文档),位于一台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
            }
        }
    ])
    
  4. 这三个查询还可能包括对以下字段进行过滤:日期,位置,坐标,语言,作者。

    我还没有索引,所以查询运行速度非常慢。但是由于我对数据的不同方式的索引会有很大不同,这是否会排除索引作为解决方案?或者有没有办法为所有这些案例编制索引而不必对集合进行分片?基本上我的问题是:

    • 在这种情况下,什么是一个好的索引策略?
    • 我是否需要为作者和概念创建单独的集合?
    • 我应该以某种方式重构我的数据吗?
    • 我是否需要对我的收藏进行分片,或者我的8GB单服务器是否足以处理该数据?

1 个答案:

答案 0 :(得分:0)

你的收藏品上有索引吗?

看看以下

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

如果你有索引,请确保通过执行以下操作来点击它们

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

您还需要向我们提供有关您的设置的更多信息。服务器有多少RAM?我已经使用了一个拥有200GB的MongoDB,分别位于3个分片上。所以1GB上的13GB应该不是问题