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

MongoDB中的隐藏索引

作者头像
保持热爱奔赴山海
发布于 2025-04-26 05:44:21
发布于 2025-04-26 05:44:21
570
举报
文章被收录于专栏:数据库相关数据库相关

官方文档:https://www.mongodb.com/zh-cn/docs/v8.0/core/index-hidden/

从MongoDB5.0开始引入了隐藏索引这个特性

隐藏索引对查询规划器不可见,且不能用于支持查询。

使用场景:

通过向规划器隐藏索引,您可以评估在不实际删除索引的情况下删除索引的潜在影响。如有不利影响,您可以取消隐藏该索引,而不必重新创建删除的索引。

行为

  1. 除了对规划器隐藏之外,隐藏索引的行为与未隐藏索引相同。例如:
    1. 如果隐藏索引是唯一索引,则该索引仍将其唯一约束应用于文档。
    2. 如果隐藏索引是 TTL 索引,该索引仍会使文档过期。
    3. 隐藏的索引包含在 listIndexes 和 db.collection.getIndexes() 结果中。
    4. 隐藏索引在对集合执行写入操作时进行更新,并继续消耗磁盘空间和内存。因此,它们包含在各种统计操作中,例如 db.collection.stats() 和 $indexStats。
    5. 隐藏未隐藏索引或取消隐藏索引都会重置其 $indexStats。隐藏已隐藏的索引或取消隐藏已取消隐藏的索引不会重置 $indexStats。

限制

  1. 要隐藏索引,必须将 featureCompatibilityVersion 设置为 5.0 或更大。
  2. 您无法隐藏 _id 索引。
  3. 不能 cursor.hint() 隐藏的索引。

实验

代码语言:txt
AI代码解释
复制
插入测试数据
rs01 [direct: primary] test> db.addresses.insertOne({"borough":"abcd"})
rs01 [direct: primary] test> db.addresses.insertOne({"borough":"defg"})
rs01 [direct: primary] test> db.addresses.find()
[
  { _id: ObjectId('680c6e3818c8de83cf964033'), borough: 'abcd' },
  { _id: ObjectId('680c6e3e18c8de83cf964034'), borough: 'defg' }
]

创建一个隐藏索引
rs01 [direct: primary] test> db.addresses.createIndex(
	{ borough: 1 },
	{ hidden: true }
 );


查看索引清单
rs01 [direct: primary] test> db.addresses.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { borough: 1 }, name: 'borough_1', hidden: true }
]


查询测试
rs01 [direct: primary] test> db.addresses.find({"borough":"abcd"}).explain()['queryPlanner']['winningPlan']
{
  stage: 'COLLSCAN',
  filter: { borough: { '$eq': 'abcd' } },
  direction: 'forward'
}

取消索引的hidden属性
rs01 [direct: primary] test> db.addresses.unhideIndex( "borough_1" );
{
  hidden_old: true,
  hidden_new: false,
  ok: 1,
  '$clusterTime': {
	clusterTime: Timestamp({ t: 1745644936, i: 1 }),
	signature: {
	  hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
	  keyId: Long('0')
	}
  },
  operationTime: Timestamp({ t: 1745644936, i: 1 })
}

查看索引清单
rs01 [direct: primary] test> db.addresses.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { borough: 1 }, name: 'borough_1' }
]

再次查询测试
rs01 [direct: primary] test> db.addresses.find({"borough":"abcd"}).explain()['queryPlanner']['winningPlan']
{
  stage: 'FETCH',
  inputStage: {
	stage: 'IXSCAN',
	keyPattern: { borough: 1 },
	indexName: 'borough_1',
	isMultiKey: false,
	multiKeyPaths: { borough: [] },
	isUnique: false,
	isSparse: false,
	isPartial: false,
	indexVersion: 2,
	direction: 'forward',
	indexBounds: { borough: [ '["abcd", "abcd"]' ] }
  }
}

可以看到执行计划变成了 IXSCAN 可以利用到索引了。


TIPS: 
隐藏一个索引,可以使用索引名的写法,也可以使用具体的列的写法:
	db.restaurants.hideIndex( { borough: 1, ratings: 1 } ); // Specify the index key specification document  列出相关列的写法
	db.restaurants.hideIndex( "borough_1_ratings_1" );  // Specify the index name  指定索引名的写法

对于一个已存在的索引,将它改为hidden属性。
	db.addresses.hideIndex( "borough_1" );  或者 db.addresses.hideIndex( { borough: 1 } );

本文系外文翻译,前往查看

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

本文系外文翻译,前往查看

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MongoDB 单键(列)索引
MongoDB支持基于集合文档上任意列创建索引。缺省情况下,所有的文档的_id列上都存在一个索引。基于业务的需要,可以基于一些重要的查询和操作来创建一些额外的索引。这些索引可以是单列,也可是多列(复合索引),多键索引,地理空间索引,文本索引以及哈希索引等。 本文主要描述在基于文档上的单列来创建索引。 一、创建语法 语法:db.collection.createIndex(keys, options) keys: 一个包含字段和值键值对的文档,指定该键即在该键上
Leshami
2018/08/13
1.1K0
MongoDB 单键(列)索引
MongoDB 多键索引
更多参考 MongoDB 单键(列)索引 MongoDB 复合索引 MongoDB执行计划获取(db.collection.explain())
Leshami
2018/08/13
1.7K0
MongoDB 多键索引
[953]mongo创建索引及索引相关方法
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
周小董
2021/03/11
3.8K0
[953]mongo创建索引及索引相关方法
MongoDB 索引-Index
索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
用户9615083
2022/12/25
1.6K0
MongoDB 索引-Index
MongoDB profile分析慢查询
在MongoDB中,如果发生了慢查询,我们如何得到这些慢查询的语句,并优化呢?今天来看这块儿的一些心得。
AsiaYe
2021/05/10
2.4K0
技术分享 | MongoDB 一次排序超过内存限制的排查
某次在客户现场处理一起APP业务中页面访问异常的问题,该页面直接是返回一行行硕大的报错代码,错误大概如下所示:
拓荒者
2019/07/04
3.4K0
云上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.4K0
云上MongoDB常见索引问题及最优索引规则大全
MongoDB 聚合怎么写,更复杂的聚合案例
上期我们针对MongoDB的聚合操作进行了一个实例的操作并且发现了与传统数据库在操作和索引方面的有意思的不同。这次我们来继续深入聚合操作,我们这里换一个数据集合collection ,将我们的复杂度提高。
AustinDatabases
2024/07/04
2510
MongoDB  聚合怎么写,更复杂的聚合案例
MongoDB 复合索引
如下图所示,在集合的userid以及score列上创建一个复合索引,其中userid为升序,score为降序
Leshami
2018/08/13
3.2K0
MongoDB 复合索引
MongoDB复合索引详解
摘要: 对于MongoDB的多键查询,创建复合索引可以有效提高性能。 什么是复合索引? 复合索引,即Compound Index,指的是将多个键组合到一起创建索引,这样可以加速匹配多个键的查询。不妨通
Fundebug
2018/06/28
1.4K0
mongoDB 3.0+ 查询性能分析
为了演示的效果,我们先来创建一个有200万个文档的记录。(我自己的电脑耗了15分钟左右插入完成。如果你想插更多的文档也没问题,只要有耐心等就可以了。)
MongoDB中文社区
2019/04/22
1.5K0
mongoDB 3.0+ 查询性能分析
快速体验mongoDB分片
1、mongodb分片的实质是将数据分散到不同的物理机器,以分散IO,提供并发与吞吐量 2、mongodb分片依赖于片键,即任意一个需要开启的集合都需要创建索引 3、开启分片的集合需要首先在DB级别启用库级分片 4、mongodb的分片由分片服务器,配置服务器以及路由服务器组成 5、基于分片可以结合副本集(replicate set)来实现高可用
Leshami
2018/08/13
1K0
MongoDB查询索引分析
最近几年,nosql数据库发展迅猛,mongo无疑是最闪耀的那颗明星;以前我们部门的系统,用到数据库时基本上mysql是标配;现在越来越多的项目都开始选择mongo(无论自己搭建还是使用sa的ocean);无论是mysql还是mongo,数据库是一个系统最容易出现问题、瓶颈的地方。
kevindang
2018/06/17
8.7K3
MongoDB 部分索引(Partial Indexes)
a、部分索引就是带有过滤条件的索引,即索引只存在与某些文档之上 b、满足过滤条件的文档在查询时,其执行计划将使用该列上的索引,否则不会被使用 c、稀疏索引与部分索引的差异是一个是基于某些文档存在的列,一个是列上的某些匹配条件的值 d、可以基于某个列上创建索引,而在另外的列来使用过滤条件
Leshami
2018/08/08
1.8K0
MongoDB 稀疏(间隙)索引(Sparse Indexes)
a、间隙索引就是创建索引的索引列在某些文档上列不存在,导致索引存在间隙。 b、间隙索引在创建时应指定选项:{ sparse: true } c、间隙索引列上可以指定唯一性约束
Leshami
2018/08/13
2.7K0
MongoDB-索引,你真的了解吗?
在查询的结构当中只需要关心,winningPlan 的这个 key 对应的 stage 的取值即可,stage 不同取值所对应的含义如下:
程序员NEO
2023/09/26
3060
【翻译】MongoDB指南/CRUD操作(四)
【原文地址】https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选择最有效的查询方案。然后每次执行查询时,查询系统使用此查询方案。 查询优化程序仅缓存可能有多种切实可行的方案的查询计划。 对于每一个查询,查询规划者在查询方案高速缓存中搜索适合查询形式的查询方案。如果没有匹配的查询方案,查询规划者生成几个备选方案并在一个实验周期内做出评估。查询规划者选择获胜的方案,创建包含获胜
甜橙很酸
2018/03/08
2K0
【翻译】MongoDB指南/CRUD操作(四)
最近遇到的一个MongoDB索引顺序的问题
最近遇到个mongo慢查问题,查询这样子: db.tb1.find({status:'normal', lastReviewTime:{$gte:1583038740,$lte:1585285140}}).sort({createdTime:-1}).limit(30) 执行计划如下: > db.tb1.find({status:'normal', lastReviewTime:{$gte:1583038740,$lte:1585285140}}).sort({createdTime:-1}).limit(
保持热爱奔赴山海
2020/04/01
5750
MongoDB 聚合索引
MongoDB 聚合索引是一种包含多个字段的索引,它可以提高查询效率,特别是在需要对多个字段进行查询或者聚合操作时。以下是 MongoDB 官方文档中关于聚合索引的详细说明和示例:
玖叁叁
2023/04/14
8400
初识MongoDB中的索引
索引就像图书的目录一样,可以让我们快速定位到需要的内容,关系型数据库中有索引,NoSQL中当然也有,本文我们就先来简单介绍下MongoDB中的索引。 本文是MongoDB系列的第九篇文章,了解前面的文章有助于更好的理解本文。 ---- 索引创建 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引: db.sang_collect.getIndexes() 结果如下: [ { "v" : 2, "key" : {
江南一点雨
2018/04/02
1.4K0
相关推荐
MongoDB 单键(列)索引
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档