使用多个索引加速MongoDB搜索的最佳方法是什么?

时间:2017-12-26 09:56:40

标签: python mongodb python-3.x pymongo pymongo-3.x

我有包含50k +文档的MongoDB集合,如:

{
    "_id" : ObjectId("5a42190e806c3210acd3fa82"),
    "start_time" : ISODate("2017-12-25T02:29:00.000Z"),
    "system" : "GL",
    "region" : "NY",
    "order_id" : 3,
    "task_type" : "px2",
    "status" : false
}

当我添加新订单时,Python脚本会在数据库中搜索具有相同start_time和task_type的现有订单,例如:

    tasks_base.find_one({
    "$and": [{
        "start_time": plan_date.astimezone(pytz.UTC)
    }, {
        "task_type": px
    }]
    })

它可以工作,但是集合中的每个新文档都会减慢它(更多要检查的文档等)。

作为解决方案,我想添加task_typestart_time作为集合的索引。但有一些担忧(日期作为索引看起来有点不自然)。所以,需要一个如何正确的建议(或其他想法,如何加快搜索)。感谢任何建议:)

1 个答案:

答案 0 :(得分:0)

我用3个步骤解决了它:

首先,我创建了唯一的compound index

tasks.create_index([("start_time", pymongo.ASCENDING,), ("task_proxy", pymongo.ASCENDING)], unique=True)

然后,我将查询调整为仅在索引字段(covered query)中搜索:

all_tasks = tasks.find({
        "$and": [{
            "start_time": {
                "$gte": plan_date.astimezone(pytz.UTC),
                "$lt": plan_date.astimezone(pytz.UTC) + timedelta(hours=1)
            }
        }, {
            "task_proxy": px
        }]
    }, {"_id": 0, "start_time": 1, "task_proxy": 1})

最后(上面的代码相同),我将时间查询的大小从1分钟增加到1小时,所以我可以做1个数据库操作而不是60个。我可以使用Python脚本中的大部分数据进行操作,所以加载数据库要低得多:)

UPD:重新编写80%的代码:我为每个订单使用了1个查询,现在每小时使用1个查询,在那里找到空闲时间段,并在免费单元格中打包订单(或移动如果没有足够的细胞,到另一个集合)。仍然使用复合索引和覆盖查询,脚本异常时间从15-17秒变为0.6。