暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

技术干货 | MongoDB 功能详解之隐藏索引(Hidden Indexes)

Mongoing中文社区 2023-04-26
889

点击下方公众号关注并分享获取 MongoDB 最新资讯


隐藏索引(Hidden Indexes):版本 4.4 中的新功能。

隐藏索引(Hidden indexes)对于查询分析器(query planner)来说是不可见的,不能用于对查询的支持。
通过对查询分析器隐藏索引,用户可以在并未真正删除索引的情况下,评估删除索引所带来的潜在影响。如果影响是负面的,用户可以取消隐藏索引,而不必重新创建已经删除的索引。


行为


除了对查询分析器隐藏之外,隐藏索引的行为与非隐藏索引类似,例如:


约束


  • 要使用隐藏索引,必须将功能兼容版本(featureCompatibilityVersion)设置为 4.4 或以上版本。但一旦隐藏了索引,在 MongoDB 4.4 二进制包的情况下,即使将功能兼容版本(featureCompatibilityVersion)设置为 4.2,该索引仍然是隐藏的。

  • 不能隐藏 _id 索引。
  • 不能对隐藏索引使用 cursor.hint()


示例


创建隐藏索引

使用 db.collection.createIndex()
并将 hidden 选项设为 true

⚠️ 注意:

使用 db.collection.createIndex()
的 hidden 选项,必须将功能兼容版本(featureCompatibilityVersion)设置为 4.4 或以上版本。但一旦隐藏了索引,在 MongoDB 4.4 二进制包的情况下,即使将功能兼容版本(featureCompatibilityVersion)设置为 4.2,该索引仍然是隐藏的。

例如,下面的操作就是在 borough 字段创建一个正序的隐藏索引:

db.addresses.createIndex(
{ borough: 1 },
{ hidden: true }
);

要进行验证,可以在 addresses 集合中执行 db.collection.getIndexes()
操作:
db.addresses.getIndexes()

返回以下结果:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"borough" : 1
},
"name" : "borough_1",
"hidden" : true
}
]

hidden 选项只有在值为 true 的时候才会返回。
隐藏现有索引

⚠️ 注意:

  • 要使用隐藏索引,必须将功能兼容版本(featureCompatibilityVersion)设置为 4.4 或以上版本。但一旦隐藏了索引,在 MongoDB 4.4 二进制包的情况下,即使将功能兼容版本(featureCompatibilityVersion)设置为 4.2,该索引仍然是隐藏的。

  • 不能隐藏 _id 索引。

要隐藏已存在的索引,可以使用 collMod
命令或 mongosh
执行 db.collection.hideIndex()
例如,创建一个未隐藏的索引:
db.restaurants.createIndex( { borough: 1, ratings: 1 } );

若要隐藏索引,可以使用以下任意方法:
db.restaurants.hideIndex( { borough: 1, ratings: 1 } );  // 指定索引的键


db.restaurants.hideIndex( "borough_1_ratings_1" );  // 指定索引名称

要进行验证,可以在 restaurants 集合执行 db.collection.getIndexes()
操作:
db.restaurants.getIndexes()

返回以下结果:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"borough" : 1,
"ratings" : 1
},
"name" : "borough_1_ratings_1",
"hidden" : true
}
]

hidden 选项只有在值为 true 的时候才会返回。
取消隐藏索引
要取消隐藏索引,可以使用 collMod
命令或 mongosh
执行 db.collection.unhideIndex()
。可以使用以下任意方法:
db.restaurants.unhideIndex( { borough: 1, city: 1 } );  // 指定索引的键


db.restaurants.unhideIndex( "borough_1_ratings_1" );    // 指定索引名称

验证,在 restaurants 集合执行 db.collection.getIndexes()
:
db.restaurants.getIndexes()

返回以下结果:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"borough" : 1,
"ratings" : 1
},
"name" : "borough_1_ratings_1"
}
]

索引的 hidden 选项不再显示在 borough_1_ratings_1
  索引上,因为 hidden 选项只在值为 true 的时候才会返回。
由于索引在隐藏时是一直维护的,因此在取消隐藏后将立即可用。
原文:Hidden Indexes

关于译者:

司冬雨,MongoDB 中文社区成员,现就职于中国联通软件研究院,目前专注于 MongoDB 数据库运维与技术支持。

【推荐阅读】


社区招募

为了让社区组委会成员和志愿者朋友们灵活参与,同时我们为想要深度参与社区建设的伙伴们开设了“招募通道”,如果您想要在社区里面结交志同道合的技术伙伴,想要通过在社区沉淀有价值的干货内容,想要一个展示自己的舞台,提升自身的技术影响力,即刻加入社区贡献队伍~ 点击提交申请

社区合作

接下来我们会在诸多城市举办技术大会,如果您有优质的议题和 MongoDB 相关经验的嘉宾可以与我们分享,或者有赞助合作意向的小伙伴,包含但不限制于联合主办方、媒体合作等,都可以随时联系我们的社区助手小芒果(微信ID:mongoingcom)沟通具体事宜。

重要资讯

感谢大家一直以来对社区的关注与支持!社区在大家共同的努力下不断发展与壮大,为了给大家营造更便捷的交流环境,QQ 技术交流群将同步在“微信技术交流群”中。扫描下方二维码添加小芒果微信发送“mongo”即可进入技术交流群。




获取更多精彩内容点击社区网站www.mongoing.com


扫描上方二维码添加小芒果微信

(ID:mongoingcom)

进入中文用户组技术交流群


长按二维码加入我们

文章转载自Mongoing中文社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论