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

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

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

相关文章

Tomcat 为什么要破坏 Java 双亲委派机制?

大家好,我是锋哥!! 我们分为4个部分来探讨: 什么是类加载机制?什么是双亲委任模型?如何破坏双亲委任模型?Tomcat 的类加载器是怎么设计的? 我想,在研究tomcat 类加载之前,我们复习…

react实现模拟弹框遮罩的自定义hook

需求描述 点击按钮用于检测鼠标是否命中按钮 代码实现 import React from react; import {useState, useEffect, useRef} from react;// 封装一个hook用来检测当前点击事件是否在某个元素之外 function useClickOutSide(ref,cb) {useEffect(()>{const handleClickOutside…

【LVS-NAT配置】

配置 node1:128(客户端) node2:135(调度器) RS: node3:130 node4:132 node2添加网络适配器(仅主机模式) [rootnode2 ~]# nmtui[rootnode2 ~]#…

全新 – Amazon EC2 M1 Mac 实例

去年,在 re: Invent 2021 大会期间,我写了一篇博客文章,宣布推出 EC2 M1 Mac 实例的预览版。我知道你们当中许多人请求访问预览版,我们尽了最大努力,却无法让所有人满意。不过,大家现在已经无需等待了。我很…

虫情测报系统的工作原理及功能优势

KH-CQPest虫情测报系统能够在不对虫体造成任何破坏的情况下,无公害的杀死虫子,利用高倍显微镜和高清摄像头拍摄虫体照片,并将虫体照片发送到远端平台,让工作人员无需要到现场,通过平台就可以观察害虫的种类和数量&…

我能“C”——实用的调试技巧

什么是bug? 调试是什么?有多重要? debug和release的介绍。 windows环境调试介绍。 一些调试的实例。 如何写出好(易于调试)的代码。 编程常见的错误。 1.什么是bug? 世界上第一个bug是程序员赫柏发现的。 …

Android性能优化----执行时间优化

作者:lu人皆知 在APP做启动优化时,Application会做一些初始化的工作,但不要在Application中做耗时操作,然而有些初始化工作可能是很耗时的,那怎么办?初始化操作可以开启子线程来完成。 计算执行时间 常规…

Vue在页面输出JSON对象,测试接口可复制使用

效果图&#xff1a; 数据处理前&#xff1a; 数据处理后&#xff1a; 代码实现&#xff1a; HTML: <el-table height"600" :data"tableData" border style"width: 100%" tooltip-effect"dark" size"mini"><el-…

【vue3】固定上导航栏和左侧导航栏,只显示其他内容在主内容区域

实现思路&#xff1a; 在一个单独的vue组件文件中只写出上导航栏和左侧导航栏的内容将你想要展示的页面主内容写到单独的组件中在index.js写路由&#xff0c;将【想要展示的页面主内容的路由】作为【子路由】写在【只写出上导航栏和左侧导航栏的路由】的下面&#xff1b; 在el…

24. 两两交换链表中的节点

给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2,1,4…

【山河送书第七期】:《强化学习:原理与Python实战》揭秘大模型核心技术RLHF!

《强化学习&#xff1a;原理与Python实战》揭秘大模型核心技术RLHF&#xff01; 一图书简介二RLHF是什么&#xff1f;三RLHF适用于哪些任务&#xff1f;四RLHF和其他构造奖励模型的方法相比有何优劣&#xff1f;五什么样的人类反馈才是好反馈&#xff1f;六如何减小人类反馈带来…

宏工科技十五周年,“归零心态”竞逐全球

长久以来&#xff0c;物料处理领域一直处于被大型跨国企业垄断&#xff0c;或是国内厂商野蛮生长的状态&#xff0c;宏工科技在15年发展中&#xff0c;通过培育自身的技术创新与自主研发能力&#xff0c;在物料处理领域突围&#xff0c;实现跨行业发展、规模化扩张和持续增长。…