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

整理mongodb文档:索引

个人博客

整理mongodb文档:索引

个人博客,求关注,有问题的地方欢迎指出,觉得讲解的繁琐的也请指出

文章概叙

本文主要还是在shell下的操作。让大家了解下mongodb中index的用途,基本的索引的新增、查看、删除等,最后再提一嘴复合索引。

数据准备

大家都知道mongodb跟javaScript的关系,所以我就不解释为什么用下面的sql来创建百万条数据了,我可不想自己手动输入百万条数据。

db.test.insertMany(new Array(1000000).fill(1).map((v, index) => {return {index,single_digit: index % 10,}})
);

比如我们想要查询出所有的个位数为2的数据,我们用find方法查询,但是为了看下查询的状态,我们使用下面的sql,增加了explain方法

db.test.find({single_digit:2}).explain("executionStats")

explain 操作提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化
executionStats顾名思义,代表的是运行时候的状态,关于explain的后续会有一个博客讲解下,这儿主要是让大家知道正常情况下运行find方法的”消耗“,方便对后面做对比。
在这里插入图片描述

executionTimeMillis 代表的是运行的时间,显示的时间是1198ms。
totalDocsExamined 代表的是我们去检查的文档的总数,正好一百万,说明人家遍历了我们整个集合。
总结一句,find方法遍历了我们的文档,并且花费了1.198s的时间去返回我们想要的数据。

接着我们进入索引的范畴。

获取索引列表

db.test.getIndexes()

在这里插入图片描述

可以看到,默认有一个索引,叫做"_id",也就是唯一id,这个可以理解,毕竟人家是唯一id,而且官网上的解释也很清晰。
在创建集合期间,MongoDB 在_id字段上创建唯一索引。该索引可防止客户端插入两个具有相同值的文档。你不能将_id字段上的index删除。
其中,v表示的是当前索引系统的版本,其余的两个参数,分别代表索引的名字还有索引的内容,看完下面的介绍,肯定就会明白的。

创建索引

现在我们已经知道有一个默认的_id索引了,接下来需要创建一个关于single_digit的索引,方便我们后续的查询。

db.test.createIndex()

结合到我们的例子中,便是

db.test.createIndex({ single_digit: 1 })

其中,single_digit代表的是我们的索引字段。
1代表该索引使用升序方式排序,-1则表示使用降序。最主要是理解到单个索引是如何使用的。

对于单字段索引和排序操作,索引键的排序顺序(升序或降序)并不重要,因为MongoDB可以从任何方向遍历索引。

在这里插入图片描述

可以看到,现在创建了一个名字叫做single_digit_1的,而由于该索引只有一个字段,所以我们称呼为单字段索引。
再有了索引的条件下,我们重新用find方法查询下db
在这里插入图片描述

可以看到,在用了索引的条件下,使用了346ms的时间,查询了十万条数据,返回了十万条数据。
至此,我们可以理解为索引就是根据特定的条件,对数据进行分类,用户根据条件查询的时候,如果击中了索引的条件,就直接使用索引去查询,这样子能节省时间。
需要注意的是,如果索引已经存在了,再创建一个相同的索引的时候,是无效的,不做例子介绍了,可以自己再创建一个“single_digit”为-1的测试下。

删除索引

有了新增,也就有了删除,尤其是索引这种很占用内存的东西上

db.test.dropIndex('single_digit_1')

在这里插入图片描述

如果是删除所有的索引,可以使用

db.test.dropIndexs()

删除索引的方法没什么需要注意的,对我们来说,有参数就是删除特定索引,没有参数就是直接删除所有的索引

重建索引

首先,让我们将刚刚的single_digit索引加回来。此时,先贴一段话

db.collection.reIndex() may only be run on standalone instances. For
most users, the db.collection.reIndex() command is unnecessary.

大概翻译过来就是,对于大部分的用户来说,reIndex是不必要的。而且reIndex在6.0之后会被废弃,所以我依旧建议看看就行。
假设下面的情况,我们的数据库中现在有100万条数据,而现在的索引,是基于当前的数据建造的,那么如果我们再加入100万条数据,我们是否要重新去创建一次索引呢?首先答案是否定的,具体可以从stats方法去查看出当前数据的状态

db.test.stats()

在这里插入图片描述

其中可以看到当前的索引大小为10MB,而更新之前的大小为5MB.建议大家自己看看stats指令的作用。
实际开发中,reIndex的作用很小,如果有参数的时候,更新的是特定的索引,用法如下

db.test.reIndex({ "single_digit_1": 1 })

而当不赋予参数之后,则表示更新全部的索引

db.test.reIndex()

请注意,更新索引的代价是很高的。需要重新遍历一次数据去重建索引,所以很不建议,尤其是新手,要更新索引,必须先问下你的boss,然后再确定找个空闲的时间更新

知道了最简单的索引的创建、删除,以及对索引的"更新",对于索引就有了大概的了解了。接下来重点放在索引的类型上。

复合索引

很多情况下,我们的查询并不是只有一个关键字段,假设一个系统中,我们要遍历出所有的广东省的男性,这时候我们的sql就需要两个条件,分别是男性以及广东省,此时就可以创建一个复合索引,如下(数据随便创建了几条)
在这里插入图片描述

db.orders.createIndex({ province: 1, gender: 1 })

复合索引中列出的字段的顺序很重要。索引将包含对文档的引用,这些文档首先按item字段的值排序,然后在该字段的每个值内item,按stock字段的值排序。有关更多信息,请参见排序顺序。
大概意思就是,当我们创建复合索引的时候,我们需要注意列出的字段的顺序。比如这儿列出的是省份,才是性别。
新手可以粗略的理解为后面使用index查询的时候,先击中省份,再击中性别,如果想要知道具体的,建议查询官网中关于mongodb的ESR。

在这里插入图片描述

复合索引能很大程度的降低查询的时间,但是有最多32个字段的限制,而且索引并不是越多越好的。过多的索引会造成很多的内存占用。

对于其他的索引类型。比如文本索引以及通配符索引,可以大概去官网查看下,如果写了,篇幅会过大,且新手没掌握的时候会云里雾里,所以我就不展开了。

最后的话

简单来说,索引的作用就是为了更快得查询数据,很多时候单字段的索引足够满足我们的需求,对于部分较为常用的数据,可以使用复合数据。
但是索引需要用到内存,本质上是将部分的数据做了处理后将其保存下来,方便我们的查询,但是盲目创建索引,会让自己的项目越来越卡顿。
如果想知道自己的sql是否使用了index,可以使用explain()指令,查看是否用的"IXSCAN"(索引查询),以及使用的是哪一个index。
在这里插入图片描述

不建议指定index的名字,所以博客中并没有指出如何设置name。

相关文章:

整理mongodb文档:索引

个人博客 整理mongodb文档:索引 个人博客,求关注,有问题的地方欢迎指出,觉得讲解的繁琐的也请指出 文章概叙 本文主要还是在shell下的操作。让大家了解下mongodb中index的用途,基本的索引的新增、查看、删除等,最后…...

EPICS libCom库(4) -- epicsTimer

epicsTimer.h描述了一个C和C timer功能。 1 C接口 1.1 epicsTimerNotify和epicsTimer /* 使用一个timer的代码必须实现epicsTimerNotify */ class LIBCOM_API epicsTimerNotify { public:enum restart_t { noRestart, restart };class expireStatus {public:LIBCOM_API expir…...

成都大运会,保障大型活动无线电安全需要…

成都大运会 7月28日,备受关注的第31届世界大学生夏季运动会在成都正式开幕。据悉,这是全球首个5G加持的智慧大运会,也是众多成熟信息技术的综合“应用场”。使用基于5G三千兆、云网、8K超高清视频等技术,在比赛现场搭建多路8K摄像…...

【Spring Boot】构建RESTful服务 — 实战:实现Web API版本控制

实战:实现Web API版本控制 前面介绍了Spring Boot如何构建RESTful风格的Web应用接口以及使用Swagger生成API的接口文档。如果业务需求变更,Web API功能发生变化时应该如何处理呢?可以通过Web API的版本控制来处理。 1.为什么进行版本控制 …...

6.Web后端开发【SpringBoot入门】

文章目录 1 SpringBoot快速入门1.1 Web分析 2. HTTP协议2.1 HTTP-概述2.1.1 介绍2.2.2 特点 2.2 HTTP-请求协议2.3 HTTP-响应协议2.3.1 格式介绍2.3.2 响应状态码 常见的相应状态码 3 WEB服务器3.1 服务器概述 1 SpringBoot快速入门 Spring的官网Spring Boot 可以帮助我们非常…...

[ubuntu]ubuntu18.04使用自带共享桌面实现vncserver连接

vncserver有很多方法比如你安装vnc4server,tightvncserver,x11vnc等都可以实现vnc局域网连接,今天使用系统共享桌面设置vnc连接 Ubuntu开启远程桌面 Ubuntu18.04使用gnome桌面环境,系统自带屏幕共享和远程登录功能,默认使用的是vino作为VNC…...

docker启用cgroup v2

要求 本人的操作系统是kali,基于debian docker info如果你这里是2那么说明启用了,如果是1,那么就未启用 对于Docker来说,Cgroups v2的使用需要满足以下条件: Linux内核版本在4.15以上。 uname -r 系统已经启用Cgro…...

Java课题笔记~ Axios

Axios 对原生的AJAX进行封装&#xff0c;简化书写。 Axios官网是&#xff1a;https://www.axios-http.cn 2.1 基本使用 axios 使用是比较简单的&#xff0c;分为以下两步&#xff1a; 引入 axios 的 js 文件 <script src"js/axios-0.18.0.js"></script…...

ip地址和地理位置有关系吗

在互联网时代&#xff0c;网络已经成为了人们生活中不可或缺的一部分。而在网络通信中&#xff0c;IP地址扮演着非常重要的角色。那么&#xff0c;IP地址和地理位置之间是否有关系呢&#xff1f;虎观代理小二二将从以下几个方面进行探讨。 一、IP地址和地理位置的基本概念 首…...

mac指定node版本 mac node版本降级 mac切换node版本

本文解决问题&#xff1a; mac指定node版本 mac切换node版本 mac node版本降级 第一步 进行nvm 安装操作 brew install nvm 执行 nvm --version nvm --version 出现zsh: command not found: nvm问题去进行配置第二步 nvm配置 1.输入: vim ~/.bash_profile 点击 i 进行插入…...

C# Windows登录界面进行截图,控制鼠标键盘等操作实现(一)

首先常规的账户进程是没办法获取登录界面的信息的&#xff0c;因为登录界面已经不在某个账户下了&#xff0c;登录界面显示了每一个账户的切换。所以得使用System权限的进程。 那么Windows系统究竟是怎么将登录界面与用户桌面隔离开的呢&#xff1f;首先先通过一些Windows操作系…...

因果推断(五)基于谷歌框架Causal Impact的因果推断

因果推断&#xff08;五&#xff09;基于谷歌框架Causal Impact的因果推断 除了传统的因果推断外&#xff0c;还有一些机器学习框架可以使用&#xff0c;本文介绍来自谷歌框架的Causal Impact。该方法基于合成控制法的原理&#xff0c;利用多个对照组数据来构建贝叶斯结构时间…...

VR全景加盟项目如何开展?如何共赢VR时代红利?

VR全景作为一个新兴蓝海项目&#xff0c;相信有着很多人刚接触VR行业的时候都会有这样的疑问&#xff1a;VR全景加盟后项目如何开展&#xff1f;今天&#xff0c;我们就从项目运营的三个阶段为大家讲解。 一、了解项目时 目前VR全景已经被应用到各行各业中去&#xff0c;学校、…...

Win10+anaconda+CUDA+pytorch+vscode配置

Win10anacondaCUDApytorchvscode配置 1.安装anaconda2.安装CUDA确认CUDA版本确认CUDA和pytorch版本安装CUDA 3.安装cudnn4.安装Pytorch5.vscode配置安装VScodevscode配置pytorch环境 1.安装anaconda 官网https://www.anaconda.com 下载安装&#xff0c;路径全英文然后记得有一…...

vue-router在vue2/3区别

构建选项区别 vue2-router const router-new VueRouter({mode:history,base:_name,})vue-next-router import { createRouter,createWebHistory} from vue-next-router const routercreateRouter({history:createHistory(/) })在上述代码中我们发现,vue2中的构建选项mode和ba…...

Apache Doris 入门教程33:统计信息

统计信息 统计信息简介​ Doris 查询优化器使用统计信息来确定查询最有效的执行计划。Doris 维护的统计信息包括表级别的统计信息和列级别的统计信息。 表统计信息&#xff1a; 信息描述row_count表的行数data_size表的⼤⼩&#xff08;单位 byte&#xff09;update_rows收…...

有效需求的特征

如何区分优秀的软件需求和软件需求规格说明书&#xff08;SRS&#xff09;与可能导致问题的需求和规格说明书&#xff1f;在这篇文章中&#xff0c;我们将首先讨论单个需求应该具有的几种不同特性。然后&#xff0c;我们将讨论成功的SRS整体应具有的理想特征。 1.有效需求的特…...

基于51单片机无线温度报警控制器 NRF24L01 多路温度报警系统设计

一、系统方案 1、本设计默认采用STC89C52单片机&#xff0c;如需更换单片机请联系客服。 2、接收板LCD1602液晶实时显示当前检测的2点温度值以及对应的上下限报警值。发射板由DS18B20采集温度值&#xff0c;通过无线模块NRF24L01传给接收板。 3、按键可以设置温度上下限值&…...

Spring Data JPA的@Entity注解

一、示例说明 rules\CouponTypeConverter.java Converter public class CouponTypeConverterimplements AttributeConverter<CouponType, String> {Overridepublic String convertToDatabaseColumn(CouponType couponCategory) {return couponCategory.getCode();}Overr…...

CANoe panel中,Path Dialog如何保存选择的文件路径

这里写目录标题 Path Dialog控件的设置系统变量和环境变量 Path Dialog控件的设置 过滤加载的文件类型 填写格式为&#xff1a;Hex file |.hex 其中Hex file为自定义name&#xff0c;.hex为你想识别的文件类型 系统变量和环境变量 系统变量&#xff1a;在canoe的Environmen…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...