当前位置: 首页 > news >正文

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 里的慢请求可能是索引建立的不够导致,也可能是索引过多导致

创建删除索引

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

相关文章:

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

MongoDB索引 官方文档 https://docs.mongodb.com/manual/indexes/#create-an-index 默认索引 _id index Mongodb 在 collection 创建时会默认建立一个基于_id 的唯一性索引作为 document 的 primarykey,这个 index 无法被删除 单个字段索引 单字段索引是 Mongo…...

ebpf实战(一)-------监控udp延迟

问题背景: 为了分析udp数据通信中端到端的延迟,我们需要对整个通信链路的每个阶段进行监控,找出延迟最长的阶段. udp接收端有2个主要路径 1.数据包到达本机后,由软中断处理程序将数据包接收并放入udp socket的接收缓冲区 数据接收流程 2. 应用程序调用recvmsg等a…...

中西部各省市翻译协会、公关协会会长金秋圆桌会议圆满结束

中西部翻译协会共同体、中西部公共关系协会共同体共同体创建8年来,已成功举办了八届翻译大赛。时值第九届中西部翻译大赛将拉开序幕,中西部翻译协会共同体、中西部公共关系协会共同体举办的2023年度中西部各省市翻译协会、公关协会会长金秋圆桌会议&…...

极盾故事|“五步”构建某三甲医院数据安全管理集成平台

极盾科技助力某三甲医院,构建统一的数据安全管理集成平台,最终实现: 1、数据安全管理的自动化,覆盖全院医教研管15个应用场景、14项管理活动、300+项数据,完成40+个重要信息系统的自动监控、风…...

【开题报告】基于uni-app的恋爱打卡app的设计与实现

1.选题背景 如今,随着移动互联网的普及和人们对生活品质的追求,恋爱已经成为了许多人关注的焦点。然而,在恋爱过程中,由于种种原因,往往会忽略掉一些重要的时刻和细节,导致感情降温甚至破裂。因此&#xf…...

Python 2.7 在 Debian 服务器上获取 URL 时的 SSL 验证失败问题与解决方案

在使用Python的requests库从Debian稳定服务器上获取简单URL时,遇到了SSL证书错误。 根据用户的问题描述,您遇到了SSL证书验证失败的问题。 要解决这个问题,您可以采取以下步骤: 1. 升级到Python 2.7的最新版本: 首…...

导出文件到指定路径??

需求:点击导出pdf按钮,弹出系统文件夹弹框,可以选择保存文件的位置。 经查询window.showSaveFilePicker可实现,但这个api处于实验阶段,且用下来确实和浏览器类型、浏览器版本、以及本身api就不稳定有关系。 代码见下…...

腾讯微服务平台TSF学习笔记(二)--如何使用spring cloud zuul实现线上流量复制

需求提了n遍了,好好好,那这个需求就由我测试来做 1.在zuul端配置: ●假设provider-mirror是provider-demo的灰度应用 package com.tencent.tsf.msgw.zuul1.filter;import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.Re…...

React自定义Hook之useRequest

一、简介 通过自定义hook,实现对http请求封装。 支持loading状态判断请求进度,支持获取请求正确和错误结果。 二、技术方案 use request hook export const useRequest (options) > {// 请求参数const [url, ...init] options;// 请求返回的数…...

【LeetCode】挑战100天 Day13(热题+面试经典150题)

【LeetCode】挑战100天 Day13(热题面试经典150题) 一、LeetCode介绍二、LeetCode 热题 HOT 100-152.1 题目2.2 题解 三、面试经典 150 题-153.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站,提供各种算法和数据结构的题目&…...

Android 11.0 SystemUI 去掉状态栏wifi流量上下行图标功能实现

1.概述 在11.0系统定制rom开发中,在关于systemui的定制功能总,在SystemUI 状态栏上显示时钟,电池电量 wifi图标,在显示wifi图标时,网络实时更新时,但是会时不时显示上下行图标 显得很不美观,客户需求要求不显示上下行图标,所以需要去掉上下行图标功能,接下来实现相关功能…...

掌握Net User命令:轻松创建、修改、删除和查看本地用户帐户

net user 命令用于管理本地用户帐户。它可以用于创建、修改、删除用户帐户,以及查看用户帐户的信息 在Windows操作系统中,Net User命令是一个强大的工具,它允许管理员创建、修改、删除和查看本地用户帐户。无论你是IT专业人士还是普通用户&am…...

性能优化中使用Profiler进行页面卡顿的排查及解决方式

文章目录 一、前言二、页面卡顿的排查方式1、耗时操作的监控2、页面卡顿的监控 三、参考链接 一、前言 程序的优化在做过线上bug处理,布局层级优化,项目依赖库版本更新,重复库合并,删除未使用的资源,删除冗余的库&…...

深入了解Java8新特性-日期时间API_LocalDate类

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概12000多字,预计阅读时间长需要10分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&…...

PyTorch基本操作和工作流程

1. PyTorch基础 张量(Tensors): 学习 PyTorch 中表示数据的基本单元。了解如何创建、操作和使用张量。 自动微分(Autograd): 了解 PyTorch 的自动微分机制,这是训练神经网络的核心。 模型定义…...

Android开发从0开始(ContentProvider与数据)

内容提供者&#xff1a;ContentProvider 为App存取内部数据提供外部接口&#xff0c;让不同应用共享数据。 ①在配置里AndroidManifest.xml <provider android:name".UserInfoProvider" android:authorities"com.example.chapter07_server.provider.U…...

STM32_6(TIM)

TIM定时器&#xff08;第一部分&#xff09; TIM&#xff08;Timer&#xff09;定时器定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时不仅…...

Linux中flask项目开启https访问

1.下载阿里云免费证书 2.项目添加https配置 3.服务器开启https访问 3.1 重新安装OpenSSL 3.2.重新安装Python 上一次已经讲过Linux安装部署Python: Linux安装Python3.10与部署flask项目实战详细记录,今天记录一下Python项目如何支持https访问…...

Kubernetes 离线部署 Spinnaker

离线部署 Spinnaker 离线部署 spinnaker 需要提前准备以下依赖项 halyard 安装工具&#xff1a;该hal命令的apt源地址https://us-apt.pkg.dev/projects/spinnaker-community位于国外halyard boms物料清单&#xff1a;Spinnaker 将其halyard boms配置存储在公共谷歌云存储 ( g…...

TypeScript 学习笔记 第三部分 贪吃蛇游戏

尚硅谷TypeScript教程&#xff08;李立超老师TS新课&#xff09; 1. 创建开发环境 创建工程&#xff0c;使用学习笔记的第二部分安装css部分 npm i -D less less-loader css-loader style-loader对css部分处理&#xff0c;能够运行在低版本浏览器 npm i -D postcss postcss…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...