MongoDB——索引(单索引,复合索引,索引创建、使用)

MongoDB索引

官方文档
https://docs.mongodb.com/manual/indexes/#create-an-index

默认索引 _id index

Mongodb 在 collection 创建时会默认建立一个基于_id 的唯一性索引作为 document 的 primarykey,这个 index 无法被删除

单个字段索引

单字段索引是 Mongodb 最简单的索引类型,不同于 MySQL,MongoDB 的索引是有顺序的,支持升序或者降序。
B树组织
在这里插入图片描述

但是对于单字段索引来说,索引的顺序无关紧要,因为 MongoDB 支持任意顺序遍历单字段索引。

在此创建一个 records collection:

{"_id": ObjectId("570c04a4ad233577f97dc459"),"score": 1034,"location": { state: "NY", city: "New York" }
}

然后创建一个 单字段索引:
db.records.createIndex({ score: 1 } )
上面的语句在 collection 的 score field 上创建了一个 升序索引,这个索引支持以下查询:
db.records.find( { score: 2 } )
db.records.find( { score: { $gt: 10 } } )
可以使用 MongoDB 的 explain 来对以上两个查询进行分析:
db.records.find({score:2}).explain('executionStats')
db.records.find({"location.state":"NY"}).explain('executionStats')

嵌套字段的单索引

db.records.createIndex( { "location.state": 1 } )
上面的 embedded index 支持以下查询:
db.records.find( { "location.state": "CA" } )
db.records.find( { "location.city": "Albany", "location.state": "NY" } )

单索引排序

因为索引是排序的,所以可以支持对索引字段的排序(快速)
对于单索引来说,由于 MongoDB index 本身支持顺序查找,所以对于单索引来说以下都是可以使用到索引的

db.records.find().sort( { score: 1 } )
db.records.find().sort( { score: -1 } )
db.records.find({score:{$lte:100}}).sort( { score: -1 } )

复合索引

Mongodb 支持对多个字段建立索引,称之为复合索引。复合索引 中 field 的顺序对索引的性能有至关重要的影响,比如索引 {userid:1, score:-1}首先根据 userid 排序,然后再在每个userid 中根据 score降序排序。

在这里插入图片描述

创建复合索引
在此创建一个 products collection:

db.products.insert({"item": "Banana","category": ["food", "produce", "grocery"],"location": "4th Street Store","stock": 4,"type": "cases"
})

然后创建一个 复合索引:
db.products.createIndex( { "item": 1, "stock": 1 } )
这个 index 引用的 document 首先会根据 item 排序,然后在 每个 item 中,又会根据 stock
排序,以下语句都满足该索引:
db.products.find( { item: "Banana" } )
db.products.find( { item: "Banana", stock: { $gt: 5 } } )
条件 {item: “Banana”} 满足是因为这个 query 满足 prefix 原则

最左匹配原则

和MySQL索引最左匹配类似,都是由于底层数据结构组织的原因,MongoDB是B树组织索引,MySQL是B+树组织索引。对于复合索引来说,就需要满足最左匹配的原则Index prefix 是指 index fields 的左前缀子集,考虑以下索引:
{ "item": 1, "location": 1, "stock": 1 }
这个索引包含以下 index prefix:

{ item: 1 }
{ item: 1, location: 1 }
{ "item": 1, "location": 1, "stock": 1 }

所以只要语句满足 index prefix 原则都是可以支持使用 复合索引 的:

db.products.find( { item: "Banana" } )
db.products.find( { item: "Banana",location:"4th Street Store"} )
db.products.find( { item: "Banana",location:"4th Street Store",stock:4})

相反如果不满足 index prefix 则无法使用索引。

db.products.find( { location:"4th Street Store",stock:4} )

排序使用复合索引

sort 的顺序必须要和创建索引的顺序是一致的,一致的意思是不一定非要一样
即排序的顺序必须要和索引一致,逆序之后一致也可以,下表清晰的列出了 复合索引 满足的
query 语句:
在这里插入图片描述
考虑索引 { a: 1, b: 1, c: 1, d: 1 },即使排序的 field 不满足 index prefix 也是可以的,
但前提条件是排序 field 之前的 index field 必须是等值条件。在前面的field是等值条件情况下,B树索引构建时,在前置filed相同时,会根据后面的field排序构建,所以这种情况的排序是可以使用索引查找到对应数据的。

r1 db.data.find( { a: 5 } ).sort( { b: 1, c: 1 } ) { a: 1 , b: 1, c: 1 }
r2 db.data.find( { b: 3, a: 4 } ).sort( { c: 1 } ) { a: 1, b: 1, c: 1 }
r3 db.data.find( { a: 5, b: { $lt: 3} } ).sort( { b: 1 } ) { a: 1, b: 1 }

field顺序对索引的影响

对索引构建是没太大影响,但是对于需要扫描的文档,顺序的不同可能差别就很大了。个人理解是对基数大(数据重复度低)的字段排在前面。优先考虑能够最大化限制数据范围的索引顺序。

慢查询监控

对于查询的优化,我们可以开启慢查询监控
MongoDB 支持对 DB 的请求进行 profiling,目前支持 3 种级别的 profiling。

  • 0: 不开启 profiling
  • 1: 将处理时间超过某个阈值(默认 100ms)的请求都记录到 DB 下的 system.profile 集合 (类似于 mysql、redis 的 slowlog)
  • 2: 将所有的请求都记录到 DB 下的 system.profile 集合(生产环境慎用)

通常,生产环境建议使用 1 级别的 profiling,并根据自身需求配置合理的阈值,用于监测慢请求的情况,并及时的做索引优化。
如果能在集合创建的时候就能『根据业务查询需求决定应该创建哪些索引』,当然是最佳的选择;但由于业务需求多变,要根据实际情况不断的进行优化。索引并不是越多越好,集合的索引太多,会影响写入、更新的性能,每次写入都需要更新所有索引的数据;所以你 system.profile 里的慢请求可能是索引建立的不够导致,也可能是索引过多导致

创建删除索引

参考文章开头链接就好,很简单的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/158398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Skynet 入门实战练习】开发环境搭建 | 运行第一个项目 | debug console 简单使用

文章目录 写在前面开发环境搭建skynet配置文件项目,启动! debug console 写在前面 本系列【Skynet 入门实战练习】所有源码同步:https://gitee.com/Cauchy_AQ/skynet_practice 开发环境搭建 skynet skynet 框架地址:https://g…

什么款式的蓝牙耳机跑步不容易掉?推荐几款很不错的运动耳机

​如果你正在寻找一款性能卓越、佩戴舒适的耳机,那么运动耳机绝对是你的不二选择。它们不仅具备出色的音质,还具备防水、防汗、防震等多项特点,让你在运动时更加尽情享受音乐。接下来给大家推荐几款很不错的运动耳机。 1.南卡开放式运动耳机…

南京数字孪生赋能工业制造,加速推进制造业数字化转型

随着南京信息技术的迅猛发展和工业管理的不断演进,传统的工业管理方式已经无法满足企业对高效、智能和可持续发展的需求。针对这一情况,数字孪生技术应运而生,为南京工业管理带来了全新的变革和机遇。以数字孪生为理念,三维可视化…

闪存基本原理

系列文章目录 一、SSD主控 二、PCIe和NVMe控制器前端子系统 文章目录 系列文章目录三、闪存基本原理1.结构2.衍生问题 三、闪存基本原理 闪存是SSD的存储介质(NAND Flash),它是一种非易失性存储器(Non-volatile memory&#xff0…

centos7 怎么让命令行显示中文(英文->中文)

要让CentOS 7命令行显示中文,您需要确保您的系统支持中文字符集,并在命令行中设置正确的语言环境。以下是设置中文字符集和语言环境的步骤: 首先,确保您的系统已经安装了中文字体。在终端中运行以下命令来查看安装的中文字体&…

开源免费的流程设计器如何选型

大家在开发OA办公自动化、ERP、CRM、BPM、低代码平台等项目的时候,经常用到流程引擎,目前主流的开源流程引擎有activiti、flowable、camunda。这几个开源的流程引擎均基于BPMN2.0国际规范标准,其功能均比较强大,接口也很丰富。但涉…

关键性进展! 小米造车露真容 预计明年上市

大家好,我是极智视界,欢迎关注我的公众号,获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 小米在各种不同的产品上都在不断打上自己的品牌,这绝对不止于智能手机,而是有智能…

javaScript 内存管理

1 js 内存机制 内存空间:栈内存(stack)、堆内存(heap) 栈内存:所有原始数据类型都存储在栈内存中,如果删除一个栈原始数据,遵循先进后出;如下图:a 最先进栈&…

【剪枝】torch-pruning的基本使用

论文:DepGraph: Towards Any Structural Pruning 工程:https://github.com/VainF/Torch-Pruning 算法和库的使用介绍:CVPR 2023 | DepGraph 通用结构化剪枝 1 TP的简介 该算法介绍了DepGraph 如何建模结构化剪枝中的层依赖,实现任…

英国国家量子计算中心与IBM签署重要协议!英国进入实用量子时代

​(图片来源:网络) 近日,英国国家量子计算中心(NQCC)与IBM达成了一项重要协议。根据该协议,NQCC将为英国研究人员提供IBM量子高级计划的云访问权限,其中包括IBM的量子计算系统舰队。…

一文带你拿下MySQL之增删查改(基础)

✏️✏️✏️今天给各位带来的是关于数据库增删查改基础方面的知识。 清风的CSDN博客 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! 动动你们发财的小手&#xf…

Activiti7工作流引擎:生成实时的流程图片

实时获取当前流程对应的流程图片,并对当前正在审批的节点进行高亮显示。 public class ActivitiController {Autowiredprivate ProcessEngine processEngine;Autowiredprivate RepositoryService repositoryService;Autowiredprivate RuntimeService runtimeService…

vue超好用的自定义指令封装

一、指令封装 目录结构: index.ts 统一注册 import { App, Directive } from "vue"; import auth from "./modules/auth"; import copy from "./modules/copy"; import waterMarker from "./modules/waterMarker"; impor…

OpenStack-train版安装之基础组件安装

基础组件安装 安装MariaDB(数据库)安装RabbitMQ(消息队列)安装Memcached(缓存) 安装MariaDB(数据库) 安装 # yum install mariadb mariadb-server python2-PyMySQL -y数据库配置 …

2023年中国感应电炉产业链、产量、销量及市场规模分析[图]

感应电炉行业定义是指使用电磁感应原理,通过感应电流使金属工件在短时间内达到预定温度的工业设备。广泛应用于冶金、机械、汽车、航空、航天、船舶、电子、医疗器械等领域。 感应电炉行业产业链 资料来源:共研产业咨询(共研网) …

CSS实现空心的“尖角”

大家好,我是南宫,来分享一个昨天解决的问题。 我记得之前刷面试题的时候,CSS面试题里面赫然有一题是“如何用CSS实现三角形”,我觉得这个问题确实很经典,我上的前端培训班当初就讲过。 大概思路如下: 先…

【每周一测】Java阶段三阶段考试

目录 1、SpringBoot在整合RabbitMQ时需要导入的包是 2、下列关于RabbitMQ的confirm消息确认机制解释说明正确的是 3、关于SpringBoot的配置文件,以下说法正确的是() 4、变量命名规范说法正确的是? 5、哪个关键字可以对对象加互斥锁&…

优思学院|质量管理怎样才能做好?

质量管理怎样才能做好?这是一个好问题,很多人第一时间会想到建立一个稳定的质量管理体系,例如ISO9001,又或者善用QC七大手法等等,虽然以上这些方法都是实用和正确的,绝大多数企业通常最忽略的,其…

备案信息一键查询:网站备案信息查询API的操作与优势

前言 在当今数字化的时代,企业的在线存在至关重要。而为了确保在网络空间的法规合规性,了解和管理网站备案信息变得尤为重要。为了使这一过程更为高效、便捷,网站备案信息查询API应运而生,为企业提供了一种简便的方式来获取和管理…

如何打造适用的MES管理系统解决方案

在当前的制造业领域,项目型生产企业面临着独特的挑战。尽管国外的大型软件公司提供了某些解决方案,但由于地域、文化和制度的差异,这些方案并不完全满足企业的实际需求。为了解决这一难题,我们必须以客户为中心,围绕他…