Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MongoDB 聚合索引

MongoDB 聚合索引

原创
作者头像
玖叁叁
发布于 2023-04-14 05:37:28
发布于 2023-04-14 05:37:28
76100
代码可运行
举报
文章被收录于专栏:玖叁叁玖叁叁
运行总次数:0
代码可运行

MongoDB 聚合索引是一种包含多个字段的索引,它可以提高查询效率,特别是在需要对多个字段进行查询或者聚合操作时。以下是 MongoDB 官方文档中关于聚合索引的详细说明和示例:

定义聚合索引

在 MongoDB 中,可以通过以下语法定义聚合索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.collection.createIndex({ field1: 1, field2: -1, ... })

其中,field1field2 等为字段名称,1-1 表示该字段的索引方向,1 表示升序,-1 表示降序。可以定义多个字段,MongoDB 会按照字段的先后顺序创建索引。

例如,可以创建一个基于 nameage 字段的聚合索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.users.createIndex({ name: 1, age: -1 })

使用聚合索引进行查询

使用聚合索引进行查询时,需要指定查询条件并使用 explain() 命令查看查询执行计划,以确认是否使用了聚合索引。

例如,可以使用以下查询语句查询 name 为 "Alice"、age 大于等于 20 的用户,并查看执行计划:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.users.find({ name: "Alice", age: { $gte: 20 } }).explain()

执行计划中的 winningPlan 字段会显示是否使用了聚合索引。

优化聚合索引

为了优化聚合索引的效率,可以采取以下措施:

  • 选择正确的索引字段:根据实际查询场景选择索引字段,避免创建过多或不必要的索引。
  • 避免使用过多的索引字段:每个索引字段都需要占用额外的存储空间和处理时间,因此应该避免创建过多的索引字段。
  • 定期重新生成索引:当数据量增加或者索引使用频率发生变化时,应该及时重新生成索引,以确保索引的效率。

以下是一个使用聚合索引的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 创建聚合索引
db.users.createIndex({ name: 1, age: -1 })

// 插入数据
db.users.insertMany([
  { name: "Alice", age: 25, gender: "female" },
  { name: "Bob", age: 30, gender: "male" },
  { name: "Charlie", age: 25, gender: "male" },
  { name: "David", age: 20, gender: "male" },
  { name: "Eve", age: 30, gender: "female" }
])

// 查询年龄大于等于 25 的女性用户,使用聚合索引
db.users.find({ age: { $gte: 25 }, gender: "female" }).explain()

执行上述查询后,执行计划中的 winningPlan字段会显示使用了聚合索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "queryPlanner" : {
    "plannerVersion" : 1,
    "namespace" : "test.users",
    "indexFilterSet" : false,
    "parsedQuery" : {
      "$and" : [
        { "age" : { "$gte" : 25 } },
        { "gender" : { "$eq" : "female" } }
      ]
    },
    "winningPlan" : {
      "stage" : "FETCH",
      "inputStage" : {
        "stage" : "IXSCAN",
        "keyPattern" : { "age" : 1, "name" : 1 },
        "indexName" : "name_1_age_-1",
        "isMultiKey" : false,
        "multiKeyPaths" : { "age" : [], "name" : [] },
        "isUnique" : false,
        "isSparse" : false,
        "isPartial" : false,
        "indexVersion" : 2,
        "direction" : "forward",
        "indexBounds" : {
          "age" : [ "25", { "$maxValue" : 1 } ],
          "name" : [ { "$minValue" : 1 }, { "$maxValue" : 1 } ]
        }
      }
    },
    "rejectedPlans" : []
  },
  "serverInfo" : {
    "host" : "localhost",
    "port" : 27017,
    "version" : "4.4.0",
    "gitVersion" : "563487e100c4215e2dce98d0af2a6a5a2d67c5cf"
  },
  "ok" : 1
}

可以看到,执行计划中使用了 name_1_age_-1 索引,表示聚合索引生效。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MongoDB 部分索引(Partial Indexes)
a、部分索引就是带有过滤条件的索引,即索引只存在与某些文档之上 b、满足过滤条件的文档在查询时,其执行计划将使用该列上的索引,否则不会被使用 c、稀疏索引与部分索引的差异是一个是基于某些文档存在的列,一个是列上的某些匹配条件的值 d、可以基于某个列上创建索引,而在另外的列来使用过滤条件
Leshami
2018/08/08
1.7K0
MongoDB中$type、索引、聚合
再次执行db.col.find({“title” : {$type : 2}}).pretty();
别团等shy哥发育
2023/02/25
1.6K0
MongoDB中$type、索引、聚合
MongoDB 单键(列)索引
MongoDB支持基于集合文档上任意列创建索引。缺省情况下,所有的文档的_id列上都存在一个索引。基于业务的需要,可以基于一些重要的查询和操作来创建一些额外的索引。这些索引可以是单列,也可是多列(复合索引),多键索引,地理空间索引,文本索引以及哈希索引等。 本文主要描述在基于文档上的单列来创建索引。 一、创建语法 语法:db.collection.createIndex(keys, options) keys: 一个包含字段和值键值对的文档,指定该键即在该键上
Leshami
2018/08/13
1K0
MongoDB 单键(列)索引
MongoDB profile分析慢查询
在MongoDB中,如果发生了慢查询,我们如何得到这些慢查询的语句,并优化呢?今天来看这块儿的一些心得。
AsiaYe
2021/05/10
2.3K0
MongoDB教程(十三):MongoDB覆盖索引
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!
用户11147438
2024/07/20
2190
开心档-软件开发入门之MongoDB 覆盖索引查询
由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询结果。
iOS Magician
2023/03/21
3450
云上MongoDB常见索引问题及最优索引规则大全
本文干货较多,建议收藏学习。先将文章结构速览奉上: 一、背景 二、MongoDB执行计划 2.1 queryPlanner信息 2.2 executionStats信息 2.3 allPlansExecution信息 三、云上用户建索引常见问题及优化方法 3.1 等值类查询常见问题及优化方法     3.1.1 同一类查询创建多个索引问题     3.1.2 多字段等值查询组合索引顺序非最优     3.1.3 最左原则包含关系引起的重复索引     3.1.4 唯一字段和其他字段组合引起的无用重复索引
腾讯云数据库 TencentDB
2022/04/07
2.3K0
云上MongoDB常见索引问题及最优索引规则大全
MongoDB 学习笔记
感谢 Karl Seguin 编写的 The Little MongoDB Book 这本 MongoDB 入门书。
柳公子
2018/09/17
1.6K0
【翻译】MongoDB指南/CRUD操作(四)
【原文地址】https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选择最有效的查询方案。然后每次执行查询时,查询系统使用此查询方案。 查询优化程序仅缓存可能有多种切实可行的方案的查询计划。 对于每一个查询,查询规划者在查询方案高速缓存中搜索适合查询形式的查询方案。如果没有匹配的查询方案,查询规划者生成几个备选方案并在一个实验周期内做出评估。查询规划者选择获胜的方案,创建包含获胜
甜橙很酸
2018/03/08
1.9K0
【翻译】MongoDB指南/CRUD操作(四)
【Rochester】MongoDB的基本语法和使用
注:MongDB中默认的数据库为test,如果你没有选择数据库,集合将默认存放在test数据库中
Rochester
2021/06/23
2.6K0
MongoDB 复合索引
如下图所示,在集合的userid以及score列上创建一个复合索引,其中userid为升序,score为降序
Leshami
2018/08/13
3.1K0
MongoDB 复合索引
巧用MongoDB部分索引优化性能问题
最近研发提交业务需求,大概逻辑就是先统计总数,然后分页进行导出.SQL查询条件很简单。根据时间范围以及productTags字段必须存在作为条件.目前每天大约5000万数据量,数据保留6个月满足条件数据不多.但在没有索引的情况下,前端导出是卡死的.本次只讨论count性能问题,分页导数同样需要优化.具体SQL如下:
徐靖
2022/09/22
1.2K0
MongoDB 多键索引
更多参考 MongoDB 单键(列)索引 MongoDB 复合索引 MongoDB执行计划获取(db.collection.explain())
Leshami
2018/08/13
1.7K0
MongoDB 多键索引
mongoDB 3.0+ 查询性能分析
为了演示的效果,我们先来创建一个有200万个文档的记录。(我自己的电脑耗了15分钟左右插入完成。如果你想插更多的文档也没问题,只要有耐心等就可以了。)
MongoDB中文社区
2019/04/22
1.5K0
mongoDB 3.0+ 查询性能分析
MongoDB教程(十四):MongoDB查询分析
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!
用户11147438
2024/07/20
1650
MongoDB入门实战教程(9)
前面我们学习了如何套用常见的设计模式打造合适的模型设计,本篇我们来看看在MongoDB中如何使用索引来提高查询效率。
Edison Zhou
2021/07/01
1.6K0
SQL与mongoDB对比及映射
mongoDB是最接近与关系型数据库的开源NoSQL数据库,几乎绝大多数常用的命令或语句在SQL中都可以找到相应的对应或映射。本文主要与MySQL做了些参照,供大家参考。
Leshami
2018/08/13
8380
震撼揭秘:线上MongoDB慢查询终极优化实战解析
研发反馈指出,线上某个页面的响应速度异常缓慢,达到了16秒,严重影响了业务的正常运行。经过与研发的沟通得知,该页面调用的数据集合只会保留7天的数据,集合有6000万条记录。针对过期数据的处理,使用了根据 create_time 字段创建的过期索引,以自动使数据失效。此外,数据集合还通过 company_id 字段进行了哈希分片。
DBA实战
2024/09/06
1200
震撼揭秘:线上MongoDB慢查询终极优化实战解析
MongoDB 索引
1. ensureIndex添加索引  ensureIndex 函数帮助文档  db.blog.ensureIndex(keypattern[,options]) - options is an object with these possible fields: name, unique, dropDups  name:指定索引名称  unique:是否唯一索引  dropDups:是否删除重复  创建索引的缺点:每次插入、更新、删除时都会产生额外的开销,要尽可能少创建索引。每个集合默认的最大索引个数为64个。  如果没有对应的键,索引会将其作为null存储,所以,如果对某个建立了唯一索引,但插入了多个缺少该索引键的文档,则由于文档包含null值而导致插入失败。  例子  > db.users.find()  { "_id" : ObjectId("4fc6d0c9387a7fee4eb6bfa9"), "name" : "aaa", "age" : 23, "sex" : "male" }  { "_id" : ObjectId("4fc6d0e5387a7fee4eb6bfaa"), "name" : "bbb", "age" : 25, "sex" : "male" }  { "_id" : ObjectId("4fc6d0f4387a7fee4eb6bfab"), "name" : "ccc", "age" : 25, "sex" : "male" }  { "_id" : ObjectId("4fc6d100387a7fee4eb6bfac"), "name" : "ddd", "age" : 25, "sex" : "male" }  { "_id" : ObjectId("4fc6d110387a7fee4eb6bfad"), "name" : "eee", "age" : 23, "sex" : "male" }  > db.users.ensureIndex({"name":1,"age":-1},{"name":"userIndex"})  //1,-1代表索引方向  //查找索引  > db.system.indexes.find()  { "name" : "_id_", "ns" : "blog.users", "key" : { "_id" : 1 }, "v" : 0 }  { "_id" : ObjectId("4fc6d1d0387a7fee4eb6bfb1"), "ns" : "blog.users", "key" : { "name" : 1, "age" : -1 }, "name" : "userIndex", "v" : 0 } 
阳光岛主
2019/02/18
5760
Mongodb日常操作命令
db.js_wx_setting_menu.storageSize();
DBA实战
2024/11/18
950
Mongodb日常操作命令
相关推荐
MongoDB 部分索引(Partial Indexes)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验