MongoDB-索引对排序影响

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 如果排序的字段, 正好是索引的字段, 那么会大大提升排序效率。

索引对排序的影响

如果排序的字段, 正好是索引的字段, 那么会大大提升排序效率。


插入测试数据:

db.person.insert([
  {
    name: 'cs',
    age: 19
  },
  {
    name: 'as',
    age: 18
  },
  {
    name: 'bs',
    age: 17
  }
])


插入完测试数据之后紧接着来进行一个排序的查询看看:

db.person.explain().find().sort({
  name: 1
})


排序结果:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.person",
        "indexFilterSet" : false,
        "parsedQuery" : {
        },
        "winningPlan" : {
            "stage" : "SORT",
            "sortPattern" : {
                "name" : 1
            },
            "inputStage" : {
                "stage" : "SORT_KEY_GENERATOR",
                "inputStage" : {
                    "stage" : "COLLSCAN",
                    "direction" : "forward"
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "LAPTOP-A8CAC6IT",
        "port" : 27017,
        "version" : "4.0.28",
        "gitVersion" : "af1a9dc12adcfa83cc19571cb3faba26eeddac92"
    },
    "ok" : 1
}


很明显是一个比没有创建索引的排序慢的,默认情况下,如果排序的不是索引字段,那么是在执行的时候再去排序,然后再输出,那么我们来将对应的索引进行创建一下:

db.person.createIndex({
  name: 1
})


再次查询:

db.person.explain().find().sort({
  name: 1
})


查询结果:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.person",
        "indexFilterSet" : false,
        "parsedQuery" : {
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "name" : 1
                },
                "indexName" : "name_1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "name" : [ ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "name" : [
                        "[MinKey, MaxKey]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "LAPTOP-A8CAC6IT",
        "port" : 27017,
        "version" : "4.0.28",
        "gitVersion" : "af1a9dc12adcfa83cc19571cb3faba26eeddac92"
    },
    "ok" : 1
}


那么如果是多个字段进行排序呢:

db.person.explain().find().sort({
  name: 1,
  age: -1
})


查询结果:

{
  "queryPlanner": {
    "plannerVersion": 1,
    "namespace": "test.person",
    "indexFilterSet": false,
    "parsedQuery": {
    },
    "winningPlan": {
      "stage": "SORT",
      "sortPattern": {
        "name": 1,
        "age": -1
      },
      "inputStage": {
        "stage": "SORT_KEY_GENERATOR",
        "inputStage": {
          "stage": "COLLSCAN",
          "direction": "forward"
        }
      }
    },
    "rejectedPlans": []
  },
  "serverInfo": {
    "host": "LAPTOP-A8CAC6IT",
    "port": 27017,
    "version": "4.0.28",
    "gitVersion": "af1a9dc12adcfa83cc19571cb3faba26eeddac92"
  },
  "ok": 1
}


很明显没有走索引,这个时候就需要使用到我们之前所说的复合索引进行创建进行查询了,创建复合索引:

db.person.createIndex({
  name: 1,
  age: -1
})


排序查询:

db.person.explain().find().sort({
  name: 1,
  age: -1
})


查询结果:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.person",
        "indexFilterSet" : false,
        "parsedQuery" : {
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "name" : 1,
                    "age" : -1
                },
                "indexName" : "name_1_age_-1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "name" : [ ],
                    "age" : [ ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "name" : [
                        "[MinKey, MaxKey]"
                    ],
                    "age" : [
                        "[MaxKey, MinKey]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "LAPTOP-A8CAC6IT",
        "port" : 27017,
        "version" : "4.0.28",
        "gitVersion" : "af1a9dc12adcfa83cc19571cb3faba26eeddac92"
    },
    "ok" : 1
}


!> 如果是复合索引, 那么只有排序条件是前缀查询的形式才会使用索引来排序,例如, 复合件索引只支持前缀子查询, 也就是 A,B,C

复合索引, A,B,C 会使用索引, A,B 会使用索引, A 会使用索引, 但是 B 不会使用索引, C 也不会使用索引, B,C 也不会使用索引,

这一点就不演示了

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
4月前
|
存储 NoSQL MongoDB
掌握MongoDB索引优化策略:提升查询效率的关键
在数据库性能调优中,索引是提升查询效率的利器。本文将带你深入了解MongoDB索引的内部工作原理,探讨索引对查询性能的影响,并通过实际案例指导如何针对不同的查询模式建立有效的索引。不仅将涵盖单一字段索引,还会探讨复合索引的使用,以及如何通过分析查询模式和执行计划来优化索引,最终实现查询性能的最大化。
|
6月前
|
监控 NoSQL MongoDB
MongoDB数据库的索引管理技巧
【8月更文挑战第20天】MongoDB数据库的索引管理技巧
110 1
|
7月前
|
NoSQL Java API
MongoDB 强制使用索引 hint
MongoDB 强制使用索引 hint
204 3
|
3月前
|
存储 NoSQL 关系型数据库
MongoDB索引知识
MongoDB索引知识
40 1
MongoDB索引知识
|
8月前
|
存储 监控 NoSQL
MongoDB索引解析:工作原理、类型选择及优化策略
MongoDB索引解析:工作原理、类型选择及优化策略
|
8月前
|
NoSQL 定位技术 MongoDB
深入探索 MongoDB:高级索引解析与优化策略
深入探索 MongoDB:高级索引解析与优化策略
214 1
|
3月前
|
存储 NoSQL MongoDB
MongoDB 索引限制
10月更文挑战第22天
67 2
|
3月前
|
NoSQL MongoDB 索引
MongoDB 高级索引
10月更文挑战第22天
45 2
|
4月前
|
NoSQL MongoDB 索引
MongoDB 覆盖索引查询
10月更文挑战第21天
58 1
|
4月前
|
NoSQL Java MongoDB
MongoDB 排序
10月更文挑战第16天
53 4