整理mongodb文档:索引

news2025/1/19 11:26:35

个人博客

整理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。

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

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

相关文章

使用Dockker创建vwas容器时报错的解决方法

执行命令 docker run -it -d -p 13443:3443 --cap-add LINUX_IMMUTABLE secfa/docker-awvs没有详细看报错之前找了各种各样的解决办法,都无法解决。因此以后在看报错提示的时候耐心一点看关键词Error 后来才发现启动vwas时docker报了这个错: OSError: …

记忆正则表达式的基本元件

正则常见的三种功能,它们分别是:校验数据的有效性、查找符合要求的文本以及对文本进行切割和替换等操作。 正则表达式,简单地说就是描述字符串的规则。在正则中,普通字符表示的还是原来的意思,比如字符 a,…

【编织时空三:探究顺序表与链表的数据之旅】

本章重点 链表OJ题 1. 删除链表中等于给定值 val 的所有结点。 OJ链接 思路一:删除头结点时另做考虑(由于头结点没有前一个结点) struct ListNode* removeElements(struct ListNode* head, int val) {assert(head);struct ListNode* cur h…

利用Opencv实现人像迁移

前言: Hello大家好,我是Dream。 今天来学习一下如何使用Opencv实现人像迁移,欢迎大家一起参与探讨交流~ 本文目录: 一、实验要求二、实验环境三、实验原理及操作1.照片准备2.图像增强3.实现美颜功能4.背景虚化5.图像二值化处理6.人…

操作系统-笔记-第二章-进程调度

目录 二、第二章——【进程调度】 1、调度的概念 (1)五状态和七状态(就绪挂起、阻塞挂起) (2)三层调度 (高级、中级、低级) (3)总结 2、调度的切换 &a…

Vue--》打造个性化医疗服务的医院预约系统(六)

今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…

RGOS日常管理操作

RGOS日常管理操作 一、前言二、RGOS平台概述2.1、锐捷设备的常用登陆方式2.2、使用Console登入2.3、Telnet远程管理2.4、SSH远程管理2.5、登陆软件:SecureCRT 三、CLI命令行操作3.1、CLI命令行基础3.2、CLI模式3.3、CLI模式互换3.4、命令行特性3.4.1、分屏显示3.4.2…

(六)、深度学习框架中的算子

1、深度学习框架算子的基本概念 深度学习框架中的算子(operator)是指用于执行各种数学运算和操作的函数或类。这些算子通常被用来构建神经网络的各个层和组件,实现数据的传递、转换和计算。 算子是深度学习模型的基本组成单元,它们…

07-微信小程序-注册页面-模块化

07-微信小程序-注册页面 文章目录 注册页面使用 Page 构造器注册页面参数Object初始数据案例代码 生命周期回调函数组件事件处理函数setData()案例代码 生命周期模块化 注册页面 对于小程序中的每个页面,都需要在页面对应的 js 文件中进行注册,指定页面…

Ribbon 源码分析

Ribbon 源码分析 Ribbon Debug 分析 断点 LoadBalancerInterceptor LoadBalancerInterceptor 实现了 ClientHttpRequestInterceptor 接口,重写了其中的 intercept 方法,用来拦截请求; 获取原始的 uri 和 服务名,调用 LoadBalanc…

Spring Bean的生命周期总结(包含面试题)

目录 一、Bean的初始化过程 1. 加载Spring Bean 2. 解析Bean的定义 3. Bean属性定义 4. BeanFactoryPostProcessor 扩展接口 5. 实例化Bean对象 6. Aware感知 7. 初始化方法 8. 后置处理 9. destroy 销毁 二、Bean的单例与多例模式 2.1 单例模式(Sin…

[国产MCU]-W801开发实例-按键与GPIO输入

按键与GPIO输入 文章目录 按键与GPIO输入1、硬件准备2、软件准备3、驱动实现4、驱动测试在前面的文章中,我们成功点亮了LED,同时也知道W801的GPIO是可软件配置的。在这里,将详细介绍如何通过按键控制LED。 1、硬件准备 W801开发板一块微动开关一个10K电阻一个导线若干1uF电容…

JavaScript简介--语句--变量

目录 JavaScript简介 为什么学习 JavaScript JavaScript与ECMAScript的关系 JavaScript版本 JavaScript语句、标识符 语句 标识符 JavaScript保留关键字 变量 变量的命名规则 数据类型 变量的重新赋值 变量提升 运算符 条件语句 循环语句 JavaScript简介 JavaScri…

【RabbitMQ】RabbitMQ整合SpringBoot案例

文章目录 1、前情提要【RabbitMQ】2、RabbitMQ-SpringBoot案例 -fanout模式2.1 实现架构总览2.2 具体实现2.2.1生产者2.2.1消费者 1、前情提要【RabbitMQ】 【RabbitMQ】消息队列-RabbitMQ篇章 RabbitMQ实现流程 2、RabbitMQ-SpringBoot案例 -fanout模式 2.1 实现架构总览…

时域和频域

时 域 时域即时间域,是指以时间作为自变量,振幅作为因变量,在二维坐标图中即 横轴为时间,纵轴为振幅 下面举出例子: 频率为 2 H z 2Hz 2Hz振幅为 10 V 10V 10V 频 域 同理频域为频率为自变量即横轴 ,对于…

01信号和系统

目录 一、信号 1.什么是信号 2.信号的分类 (1)确定信号与随机信号 (2)连续时间信号与离散时间信号 (3)周期信号和非周期信号 (4)功率信号与能量信号 归一化能量的定义 归一化功率的定义 二、系统 1.什么是系统 2.系统的分类 (1)连续时间系统和离散时间系统 (2)线…

【PCL-8】方向包围盒OBB

AABB包围盒:边平行于坐标轴的最小六面体; 方向包围盒OBB:相对于坐标轴方向任意的最小立方体。 最小包围盒计算流程: 1、利用PCA主元分析法获得点云的三个主方向,获取质心,计算协方差,得到协方…

AI聊天机器人原来有这么多作用

AI聊天机器人是一种能够模拟人类对话并利用人工智能技术进行自主学习和适应的计算机程序。它们能够根据用户的输入内容来分析用户的需求,并提供相应的回答和建议。今天looklook就来和大家详细讲一下AI聊天机器人到底有什么作用吧。 AI聊天机器人的作用 1、客户服务…

【springboot】mongoTemplate增删改查操作

目录 一、代码示例1.1 pom依赖1.2 application配置1.3 controller1.4 service 二、截图示例2.1 新增2.2 修改2.3 详情2.4 分页2.5 删除 一、代码示例 1.1 pom依赖 <!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><art…

2023 年 4 款适用于安卓手机的最佳 PDF 转 Word 转换器

尝试在 Android 上将 PDF 文档转换为 Word 文件&#xff1f;好吧&#xff0c;您可能会发现要让它发挥作用几乎是不可能的&#xff0c;至少在没有任何额外工具的情况下是这样。Web 上有用于此类转换的选项&#xff0c;但本地不一定会发生任何情况&#xff08;可能除了一个应用程…