前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最近遇到的一个MongoDB索引顺序的问题

最近遇到的一个MongoDB索引顺序的问题

作者头像
保持热爱奔赴山海
发布2020-04-01 17:35:13
5050
发布2020-04-01 17:35:13
举报
文章被收录于专栏:饮水机管理员饮水机管理员

最近遇到个mongo慢查问题,查询这样子:

代码语言:javascript
复制
db.tb1.find({status:'normal', lastReviewTime:{$gte:1583038740,$lte:1585285140}}).sort({createdTime:-1}).limit(30)

执行计划如下:

代码语言:javascript
复制
> db.tb1.find({status:'normal', lastReviewTime:{$gte:1583038740,$lte:1585285140}}).sort({createdTime:-1}).limit(30).explain()
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "db1.tb1",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "$and" : [
                                {
                                        "status" : {
                                                "$eq" : "normal"
                                        }
                                },
                                {
                                        "lastReviewTime" : {
                                                "$lte" : 1585285140
                                        }
                                },
                                {
                                        "lastReviewTime" : {
                                                "$gte" : 1583038740
                                        }
                                }
                        ]
                },
                "winningPlan" : {
                        "stage" : "SORT",
                        "sortPattern" : {
                                "createdTime" : -1
                        },
                        "limitAmount" : 30,
                        "inputStage" : {
                                "stage" : "SORT_KEY_GENERATOR",
                                "inputStage" : {
                                        "stage" : "FETCH",
                                        "filter" : {
                                                "$and" : [
                                                        {
                                                                "lastReviewTime" : {
                                                                        "$lte" : 1585285140
                                                                }
                                                        },
                                                        {
                                                                "lastReviewTime" : {
                                                                        "$gte" : 1583038740
                                                                }
                                                        }
                                                ]
                                        },
                                        "inputStage" : {
                                                "stage" : "IXSCAN",
                                                "keyPattern" : {
                                                        "status" : 1,
                                                        "type" : 1,
                                                        "executionTime" : 1
                                                },
                                                "indexName" : "idx_stats_typ_execTime",   # 走的这个索引
                                                "isMultiKey" : false,
                                                "multiKeyPaths" : {
                                                        "status" : [ ],
                                                        "type" : [ ],
                                                        "executionTime" : [ ]
                                                },
                                                "isUnique" : false,
                                                "isSparse" : false,
                                                "isPartial" : false,
                                                "indexVersion" : 2,
                                                "direction" : "forward",
                                                "indexBounds" : {
                                                        "status" : [
                                                                "[\"normal\", \"normal\"]"
                                                        ],
                                                        "type" : [
                                                                "[MinKey, MaxKey]"
                                                        ],
                                                        "executionTime" : [
                                                                "[MinKey, MaxKey]"
                                                        ]
                                                }
                                        }
                                }
                        }
                },
                "rejectedPlans" : [
                        {
                                "stage" : "SORT",
                                "sortPattern" : {
                                        "createdTime" : -1
                                },
                                "limitAmount" : 30,
                                "inputStage" : {
                                        "stage" : "SORT_KEY_GENERATOR",
                                        "inputStage" : {
                                                "stage" : "FETCH",
                                                "inputStage" : {
                                                        "stage" : "IXSCAN",
                                                        "keyPattern" : {
                                                                "lastReviewTime" : 1,
                                                                "status" : 1,
                                                                "createdTime" : -1
                                                        },
                                                        "indexName" : "lastReviewTime_1_status_1_createdTime_-1",
                                                        "isMultiKey" : false,
                                                        "multiKeyPaths" : {
                                                                "lastReviewTime" : [ ],
                                                                "status" : [ ],
                                                                "createdTime" : [ ]
                                                        },
                                                        "isUnique" : false,
                                                        "isSparse" : false,
                                                        "isPartial" : false,
                                                        "indexVersion" : 2,
                                                        "direction" : "forward",
                                                        "indexBounds" : {
                                                                "lastReviewTime" : [
                                                                        "[1583038740.0, 1585285140.0]"
                                                                ],
                                                                "status" : [
                                                                        "[\"normal\", \"normal\"]"
                                                                ],
                                                                "createdTime" : [
                                                                        "[MaxKey, MinKey]"
                                                                ]
                                                        }
                                                }
                                        }
                                }
                        },
                        {
                                "stage" : "SORT",
                                "sortPattern" : {
                                        "createdTime" : -1
                                },
                                "limitAmount" : 30,
                                "inputStage" : {
                                        "stage" : "SORT_KEY_GENERATOR",
                                        "inputStage" : {
                                                "stage" : "FETCH",
                                                "inputStage" : {
                                                        "stage" : "IXSCAN",
                                                        "keyPattern" : {
                                                                "lastReviewTime" : -1,
                                                                "status" : 1
                                                        },
                                                        "indexName" : "lastReviewTime_-1_status_1",
                                                        "isMultiKey" : false,
                                                        "multiKeyPaths" : {
                                                                "lastReviewTime" : [ ],
                                                                "status" : [ ]
                                                        },
                                                        "isUnique" : false,
                                                        "isSparse" : false,
                                                        "isPartial" : false,
                                                        "indexVersion" : 2,
                                                        "direction" : "forward",
                                                        "indexBounds" : {
                                                                "lastReviewTime" : [
                                                                        "[1585285140.0, 1583038740.0]"
                                                                ],
                                                                "status" : [
                                                                        "[\"normal\", \"normal\"]"
                                                                ]
                                                        }
                                                }
                                        }
                                }
                        }
                ]
        },
        "ok" : 1
}

这种情况下,我们的索引顺序需要注意下,这样写:

{精确匹配字段,排序字段,范围查询字段} 这样的索引排序会更为高效

代码语言:javascript
复制
db.tb1.createIndex({status:1,createdTime:-1,lastReviewTime:1},{background:true})

加完索引后,可以发现查询速度有质的飞越了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档