Mongodb中的索引

目录

索引的类型

单字段索引

符合索引

其他索引

索引的管理操作

查看索引

创建索引

移除索引

索引的使用 

执行计划

覆盖的索引查询


索引支持在MongoDB中高效地执行查询。

如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。 如果查询存在适当的索引,MongoDB可以使用该索引限制必须检查的文档数。

索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB还可以使用索引中的排序返回排序结果。

MongoDB索引使用B树数据结构(确切的说是B-Tree,MySQL是B+Tree)

索引的类型

单字段索引

MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,称为单字段索引(Single Field Index)。

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

符合索引

MongoDB还支持多个字段的用户定义索引,即复合索引(Compound Index)。 复合索引中列出的字段顺序具有重要意义。

例如,如果复合索引由 { userid: 1, score: -1 } 组成,则表示索引首先按userid正序排序,然后在每个userid的值相同的时候,再按score倒序排序。

其他索引

地理空间索引(Geospatial Index)、文本索引(Text Indexes)、哈希索引(Hashed Indexes)。

地理空间索引(Geospatial Index)

为了支持对地理空间坐标数据的有效查询,MongoDB提供了两种特殊的索引:返回结果时使用平面几何的二维索引和返回结果时使用球面几何的二维球面索引。

文本索引(Text Indexes)

MongoDB提供了一种文本索引类型,支持在集合中搜索字符串内容。这些文本索引不存储特定于语言的停止词(例如“the”、“a”、“or”), 而将集合中的词作为词干,只存储根词。

哈希索引(Hashed Indexes)

为了支持基于散列的分片,MongoDB提供了散列索引类型,它对字段值的散列进行索引。这些索引在其范围内的值分布更加随机,但只支 持相等匹配,不支持基于范围的查询。

索引的管理操作

查看索引

说明: 返回一个集合中的所有索引的数组。

语法:

db.collection.getIndexes()

结果中显示的是默认 _id 索引。

默认_id索引: MongoDB在创建集合的过程中,在 _id 字段上创建一个唯一的索引,默认名字为 _id_ ,该索引可防止客户端插入两个具有相同值的文档,您不能在_id字段上删除此索引。

注意:该索引是唯一索引,因此值不能重复,即 _id 值不能重复的。在分片集群中,通常使用 _id 作为片键。

创建索引

说明: 在集合上创建索引。

语法:

db.collection.createIndex(keys, options)

参数

参数类型描述
keysdocument包含字段和值对的文档,其中字段是索引键,值描述该字段的索引类型。对于字段上的升序索引,请 指定值1;对于降序索引,请指定值-1。比如: {字段:1或-1} ,其中1 为指定按升序创建索引,如果你 想按降序来创建索引指定为 -1 即可。另外,MongoDB支持几种不同的索引类型,包括文本、地理空 间和哈希索引。
optionsdocument可选。包含一组控制索引创建的选项的文档。

示例:

(1)单字段索引示例:对 userid 字段建立索引:

db.comment.createIndex({userid:1})

参数1:按升序创建索引

(2)复合索引:对 userid 和 nickname 同时建立复合(Compound)索引:

db.comment.createIndex({userid:1,nickname:-1})

移除索引

可以移除指定的索引,或移除所有索引

一、移除指定索引

语法:

db.collection.dropIndex(index)

参数类型描述
indexstring or document指定要删除的索引。可以通过索引名称或索引规范文档指定索引。若要删除文本索引,请指定 索引名称。

示例:

删除 comment 集合中 userid 字段上的升序索引:

db.comment.dropIndex({userid:1})

 

二、移除所有索引

语法

db.collection.dropIndexes()

提示: _id 的字段的索引是无法删除的,只能删除非 _id 字段的索引。


索引的使用 

执行计划

分析查询性能(Analyze Query Performance)通常使用执行计划(解释计划、Explain Plan)来查看查询的情况,如查询耗费的时间、是否基于索引查询等。

那么,通常我们想知道建立的索引是否有效,效果如何,都需要通过执行计划查看。

语法:

db.collection.find(query,options).explain(options)

查看根据userid查询数据的情况:

db.comment.find({userid:"1003"}).explain()

查看likenum大于1000的情况

db.comment.find({likenum:{$gt:1000}}).explain()

覆盖的索引查询

当查询条件和查询的投影仅包含索引字段时,MongoDB直接从索引返回结果,而不扫描任何文档或将文档带入内存。 这些覆盖的查询可以非常有效。

db.comment.find({userid:"1003"},{userid:1,_id:0}).explain()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费白嫖ChatGPT4(国内可用)

邀请链接 https://burn.hair/register?aff=2MdD网站首页 https://burn.hair使用github账号登录 登录完成之后记得进行签到,签到的token是大家能够聊天的基础,每天进行签到然后就可以免费白嫖ChatGPT4了,一般每天签到,聊天应该是够了的。

小红书搞钱美学课-6.0升级版,账号搭建/爆款创作/工具实战/账号变现篇

让我们用视觉撬动流量 课程体系 334253课程权益(5周服务期) 3节账号运营基础课3节自媒体笔记创作课。4节封面设计实操课2次实操加餐分享5次作业指导(一对一)3次答疑直播 课程大纲 一、账号搭建篇 变现模板、精准定位 二、爆款创作篇爆款选题、首图、文案与脚本、快速涨粉…

自动驾驶TPM技术杂谈 ———— 汽车信息安全通用技术要求

文章目录 介绍术语&缩略语保护对象车内系统车外通信 技术要求原期性要求系统性防御策略要求总则纵深防御要求主动防御要求韧性防御要求 保护维度要求车内系统的保护要求软件系统的保护要求真实性保密性完整性可用性访问可控性抗抵赖可核查性可预防性 电子电气硬件保护要求完…

GPT+Python近红外光谱数据分析

原文链接:GPTPython近红外光谱数据分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247603913&idx1&sn6eb8fd6f1abcdd8160815997a13eb03d&chksmfa82172ecdf59e389a860547a238bb86c7f38ae3baa14e97c7490a52ef2a2c206f88d503a5eb&token…

14:java基础-Tomcat-Web容器

文章目录 面试题Web 容器是什么?HTTP 的本质 面试题 Web 容器是什么? 让我们先来简单回顾一下 Web 技术的发展历史,可以帮助你理解 Web 容器的由来。早期的 Web 应用主要用于浏览新闻等静态页面,HTTP 服务器(比如Apa…

AMEYA360:太阳诱电叠层压电震动片介绍

触觉感应功能中振动片的定位,“触感”方面, 驱动频带宽、响应速度快的叠层压电振动片则将变得不可或缺。触觉感应功能运用了多种多样的振动片。 “通知”运用了偏心转子马达、线性谐振振动片等电磁式振动片,“力反馈”则在上述电磁式振动片的…

闭散列哈希表

一、什么是 哈希 ? 1.1 哈希概念 与 哈希冲突 在正式介绍闭散列哈希之前,我们需要明确 哈希 的概念。 哈希 :构造一种数据存储结构,通过函数 HashFunc() ,使 元素的存储位置 与 其对应的键值 建立一一映射关系&…

【Spring】Spring 整合 Junit、MyBatis

一、 Spring 整合 Junit <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…

云端地球联动大疆机场,支撑矿山高效巡检与智能监测

矿产资源是我国的重要战略性资源。近年来&#xff0c;随着矿山开采深度的逐渐增加&#xff0c;露天矿山边坡滑落等灾害频繁发生&#xff0c;威胁人民群众生命与财产安全。因此&#xff0c;对露天矿边坡进行快速、实时、有效的形变监测和预警已成为当前我国矿山防灾与安全生产的…

【CCF-CSP】202403-4 十滴水

题目描述 十滴水是一个非常经典的小游戏。 小 C 正在玩一个一维版本的十滴水游戏。我们通过一个例子描述游戏的基本规则。 游戏在一个 1c 的网格上进行&#xff0c;格子用整数x(1≤x≤c) 编号&#xff0c;编号从左往右依次递增。网格内 m 个格子里有 1∼41∼4 滴水&#xff0…

Python:如何将嵌套列表展平成单层列表

在Python中&#xff0c;我们经常会遇到需要处理列表的情况&#xff0c;尤其是嵌套列表。嵌套列表就是一个列表中包含另一个或多个列表。有时&#xff0c;我们需要将这些嵌套的列表展平成一个单层的列表&#xff0c;以便于进一步的处理和分析。本文将介绍如何使用Python将嵌套列…

【架构】MVC架构模式 三层架构

1 不使用MVC架构模式完成银行账户转账 <% page contentType"text/html;charsetUTF-8" language"java" %> <html><head><base href"${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.…

Redis加入系统服务,开机自启

vi /etc/systemd/system/redis.service i :wq #加载服务配置文件 systemctl daemon-reload #启动redis systemctl start redis #设置开机自启 systemctl enable redis #查看启动状态 systemctl status redis

每日一练 2024.5.10

题目&#xff1a; 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 示例 1&#…

Day 29 MySQL的主从复制集群

一&#xff1a;主从复制 1.主从复制概念 什么是主从复制&#xff1a; ​ 主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff1b;主数据库一般是准实时的业务数据库 主从复制的作用&#xff1a; ​ 做数据的热备&#xf…

【Python 下载大量品牌网站的图片(一)】关于图片的处理和下载,吃满带宽,可多开窗口下载多个网站,DOS窗口类型

写作日期&#xff1a;2024.05.11 使用工具&#xff1a;Python 可修改功能&#xff1a;线程量、UA、Cookie、代理、存储目录、间隔时间、超时时间、图片压缩、图片缩放 默认功能&#xff1a;图片转换、断续下载、图片检测、路径处理、存储文件 GUI&#xff1a;DOS窗口 类型&…

K8s源码分析(二)-K8s调度队列介绍

本文首发在个人博客上&#xff0c;欢迎来踩&#xff01; 本次分析参考的K8s版本是 文章目录 调度队列简介调度队列源代码分析队列初始化QueuedPodInfo元素介绍ActiveQ源代码介绍UnschedulableQ源代码介绍**BackoffQ**源代码介绍队列弹出待调度的Pod队列增加新的待调度的Podpod调…

C++:week3:数据结构与算法

文章目录 (十一) 常用数据结构1.动态数组(1)模型(2).h与.c(3)实现 2.链表(1)模型(2)分类(3)基本操作(API)(4)实现(5)链表常见面试题(6)空间与时间 3.栈(1)模型(2)基本操作(3)实现(4)栈的应用 4.队列(1)模型(2)基本操作(API)(3)实现(4)队列的应用 5.哈希表(1)哈希表的提出原因(2…

支付宝小程序如何去除页面下拉回弹

描述&#xff1a;支付宝小程序页面下拉时会产生回弹&#xff0c;如果页面上有拖拽功能&#xff0c;会有影响 解决方法&#xff1a; 页面xx.config.js中设置&#xff1a;allowsBounceVertical: “NO” 官方文档&#xff1a;https://opensupport.alipay.com/support/FAQ/7110b5d…

什么是Jetpack

Jetpack Jetpack 是一套组件库、工具&#xff0c;可帮助开发人员遵循最佳做法&#xff0c;减少样板代码并编写可在 Android 版本和设备上一致工作的代码&#xff0c;以便开发人员可以专注于他们关心的代码 组成 主要包含四部分&#xff1a;架构&#xff08;Architecture&…