《MongoDB入门教程》第27篇 创建索引

news2024/11/26 12:24:45

本文将会介绍 MongoDB 中的索引概念,以及如何利用 createIndex() 方法创建索引。

索引简介

假设存在一本包含介绍各种电影的图书。
在这里插入图片描述
如果想要查找一部名为“Pirates of Silicon Valley”的电影,我们需要翻阅每一页,直到发现该电影的介绍为止。
在这里插入图片描述
显然,这种查找方法效率低下。如果这本书包含一个内容索引,记录了电影的标题及对应的页码,我们就可以通过索引快速找到相应的电影介绍:

Pimpernel' Smith             1
...
Pirates of Silicon Valley    201
...
Twas the Night               300

在上面的索引信息中,电影“Pirates of Silicon Valley”位于这本书的 201 页。因此,我们可以直接打开 201 页查看相应的介绍:

在这里插入图片描述
从这个示例可以看出,索引可以更快地查找数据。

MongoDB 索引的工作方式和上面的示例类似,我们可以基于文档集合中的指定字段创建索引。MongoDB 使用 B-树 结构存储索引。

另一方面,当我们插入、更新或者删除文档时, MongoDB 需要维护相应的索引。也就是说,索引提高了文件的检索性能,但是需要以额外的写入和存储空间为代价。因此,应该建立合适的索引,而不是尽可能多的索引。

查看索引

我们首先创建一个新的 movies 集合,然后通过 MongoDB Compass 导入初始化数据(movies.json):

在这里插入图片描述
在这里插入图片描述
默认情况下,所有的集合都拥有一个 _id 字段索引。getIndexes() 方法可以用于查看集合中的索引,语法如下:

db.collection.getIndexes()

以下命令可以查看集合 movies 中的索引:

db.movies.getIndexes()

[ { v: 2, key: { _id: 1 }, name: '_id_' } ]

输出结果中的索引名称为“_id_”,索引字段为 _id。{ _id : 1 } 中的数字 1 代表了升序索引。

执行计划

以下查询用于查找电影“The Lake House”:

db.movies.find({
   Title: 'The Lake House'
})

{ _id: ObjectId("640165db51c91edbf4fa413f"),
  Title: 'The Lake House',
  'US Gross': 52330111,
  'Worldwide Gross': 114830111,
  'US DVD Sales': 39758509,
  'Production Budget': 40000000,
  'Release Date': 'Jun 16 2006',
  'MPAA Rating': 'PG',
  'Running Time min': null,
  Distributor: 'Warner Bros.',
  Source: 'Remake',
  'Major Genre': 'Drama',
  'Creative Type': 'Fantasy',
  Director: null,
  'Rotten Tomatoes Rating': 36,
  'IMDB Rating': 6.8,
  'IMDB Votes': 36613 }

为了查找该电影,MongoDB 需要扫描 movies 集合。在执行查询之前,MongoDB 查询计划器会选择最有效的执行计划。explain() 方法可以用于获取执行计划的相关信息。例如:

db.movies.find({
   Title: 'The Lake House'
}).explain('executionStats')

{ explainVersion: '1',
  queryPlanner: 
   { namespace: 'book.movies',
     indexFilterSet: false,
     parsedQuery: { Title: { '$eq': 'The Lake House' } },
     maxIndexedOrSolutionsReached: false,
     maxIndexedAndSolutionsReached: false,
     maxScansToExplodeReached: false,
     winningPlan: 
      { stage: 'COLLSCAN',
        filter: { Title: { '$eq': 'The Lake House' } },
        direction: 'forward' },
     rejectedPlans: [] },
  executionStats: 
   { executionSuccess: true,
     nReturned: 1,
     executionTimeMillis: 2,
     totalKeysExamined: 0,
     totalDocsExamined: 3201,
     executionStages: 
      { stage: 'COLLSCAN',
        filter: { Title: { '$eq': 'The Lake House' } },
        nReturned: 1,
        executionTimeMillisEstimate: 0,
        works: 3203,
        advanced: 1,
        needTime: 3201,
        needYield: 0,
        saveState: 4,
        restoreState: 4,
        isEOF: 1,
        direction: 'forward',
        docsExamined: 3201 } },
  command: 
   { find: 'movies',
     filter: { Title: 'The Lake House' },
     '$db': 'book' },
  serverInfo: 
   { host: 'LAPTOP-DGRB6HD9',
     port: 27017,
     version: '5.0.9',
     gitVersion: '6f7dae919422dcd7f4892c10ff20cdc721ad00e6' },
  serverParameters: 
   { internalQueryFacetBufferSizeBytes: 104857600,
     internalQueryFacetMaxOutputDocSizeBytes: 104857600,
     internalLookupStageIntermediateDocumentMaxSizeBytes: 104857600,
     internalDocumentSourceGroupMaxMemoryBytes: 104857600,
     internalQueryMaxBlockingSortMemoryUsageBytes: 104857600,
     internalQueryProhibitBlockingMergeOnMongoS: 0,
     internalQueryMaxAddToSetBytes: 104857600,
     internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600 },
  ok: 1 }

explain() 方法返回了大量的信息,我们首先需要关注 winningPlan 部分:

...
     winningPlan: 
      { stage: 'COLLSCAN',
        filter: { Title: { '$eq': 'The Lake House' } },
        direction: 'forward' },
...

winningPlan 返回了查询优化器最终选择的执行计划。示例中的 COLLSCAN 代表了集合扫描。

另外,executionStats 显示查询结果中包含 1 个文档,执行时间为 2 毫秒。

创建索引

createIndex() 方法可以用于创建新的索引。例如,以下命令可以为 movies 集合的 Title 字段创建索引:

db.movies.createIndex({Title:1})

'Title_1'

参数 { Title: 1} 包含了字段名和一个数值:

  • Title 字段是索引键;
  • 数值 1 表示按照字段的值从小到大创建升序索引,-1 表示从大到小创建降序索引。

createIndex() 方法返回了索引的名称。示例中创建的索引 Title_1 由字段名和数值 1(表示升序)组成。

再次查看集合 movies 中的索引:

db.movies.getIndexes()

[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { Title: 1 }, name: 'Title_1' }
]

再次使用 explain() 方法查看上文中查询语句的执行计划和统计信息:

db.movies.find({
   Title: 'The Lake House'
}).explain('executionStats')

{ explainVersion: '1',
  queryPlanner: 
   { namespace: 'book.movies',
     indexFilterSet: false,
     parsedQuery: { Title: { '$eq': 'The Lake House' } },
     maxIndexedOrSolutionsReached: false,
     maxIndexedAndSolutionsReached: false,
     maxScansToExplodeReached: false,
     winningPlan: 
      { stage: 'FETCH',
        inputStage: 
         { stage: 'IXSCAN',
           keyPattern: { Title: 1 },
           indexName: 'Title_1',
           isMultiKey: false,
           multiKeyPaths: { Title: [] },
           isUnique: false,
           isSparse: false,
           isPartial: false,
           indexVersion: 2,
           direction: 'forward',
           indexBounds: { Title: [ '["The Lake House", "The Lake House"]' ] } } },
     rejectedPlans: [] },
  executionStats: 
   { executionSuccess: true,
     nReturned: 1,
     executionTimeMillis: 0,
     totalKeysExamined: 1,
     totalDocsExamined: 1,
     executionStages: 
      { stage: 'FETCH',
        nReturned: 1,
        executionTimeMillisEstimate: 0,
        works: 2,
        advanced: 1,
        needTime: 0,
        needYield: 0,
        saveState: 0,
        restoreState: 0,
        isEOF: 1,
        docsExamined: 1,
        alreadyHasObj: 0,
        inputStage: 
         { stage: 'IXSCAN',
           nReturned: 1,
           executionTimeMillisEstimate: 0,
           works: 2,
           advanced: 1,
           needTime: 0,
           needYield: 0,
           saveState: 0,
           restoreState: 0,
           isEOF: 1,
           keyPattern: { Title: 1 },
           indexName: 'Title_1',
           isMultiKey: false,
           multiKeyPaths: { Title: [] },
           isUnique: false,
           isSparse: false,
           isPartial: false,
           indexVersion: 2,
           direction: 'forward',
           indexBounds: { Title: [ '["The Lake House", "The Lake House"]' ] },
           keysExamined: 1,
           seeks: 1,
           dupsTested: 0,
           dupsDropped: 0 } } },
  command: 
   { find: 'movies',
     filter: { Title: 'The Lake House' },
     '$db': 'book' },
  serverInfo: 
   { host: 'LAPTOP-DGRB6HD9',
     port: 27017,
     version: '5.0.9',
     gitVersion: '6f7dae919422dcd7f4892c10ff20cdc721ad00e6' },
  serverParameters: 
   { internalQueryFacetBufferSizeBytes: 104857600,
     internalQueryFacetMaxOutputDocSizeBytes: 104857600,
     internalLookupStageIntermediateDocumentMaxSizeBytes: 104857600,
     internalDocumentSourceGroupMaxMemoryBytes: 104857600,
     internalQueryMaxBlockingSortMemoryUsageBytes: 104857600,
     internalQueryProhibitBlockingMergeOnMongoS: 0,
     internalQueryMaxAddToSetBytes: 104857600,
     internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600 },
  ok: 1 }

此时,查询优化器选择了索引扫描(IXSCAN),而不是集合扫描(COLLSCAN)。执行时间下降到了 0 毫秒。

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

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

相关文章

从ChatGPT的技术发展角度解析未来智能化的发展方向

ChatGPT 由人工智能研究实验室 OpenAI 于 2022年11 月 30 日推出。在推出时就带来不小的震动,但真正点燃全民热潮的是,应该是从今年的二月初算起,是全网全平台涵盖各行业领域的舆论盛况。 本文就以ChatGPT为切入点,从技术发展角度…

MQTT协议分析

目录 一、前言 二、MQTT协议概述 概念 基本原理 MQTT协议的结构 MQTT的QoS机制 QoS 0:最多一次传输 QoS 1:至少一次传输 QoS 2:恰好一次传输 三、MQTT的应用场景 四、MQTT的优点和缺点 五、MQTT协议的实现 六、实战体验MQTT …

自己动手写编译器:DFA状态机最小化算法

上一节我们完成了从NFA到DFA的状态机转换,有个问题是状态机并非处于最有状态: 在上图的状态机中,状态6和7其实可以合成一个状态点,本节我们看看如何将这类节点进行合并,使得状态机处于最精简状态(状态4也是终结点&…

KDZD土壤电阻率测试仪

一、简介 KDZD土壤电阻率测试仪专为现场测量接地电阻、土壤电阻率、接地电压、交流电压而精心设计制造的,采用新数字及微处理技术,精密4线法、3线法和简易2线法测量接地电阻,导入FFT(快速傅立叶变换)技术、AFC(自动频率控制)技术,…

基于树莓派4B设计的音视频播放器(从0开始)

一、前言 【1】功能总结 选择树莓派设计一款家庭影院系统,可以播放本地视频、网络视频直播、游戏直播、娱乐直播、本地音乐、网络音乐,当做FM网络收音机。 软件采用Qt设计、播放器引擎采用ffmpeg。 当前的硬件选择的是树莓派4B,烧写官方系统,完成最终的开发。 本篇文章主…

Qt QtCreator 安卓开发环境搭建

踩坑 我的qt是使用在线安装工具安装的,Qt版本使用的是5.15.2,QtCreator版本9.0.2 在网上很多教程都是如下步骤 1.安装qt 2.安装jdk 3.安装android-sdk 4.安装android-ndk 5.配置android设置 例如: https://blog.csdn.net/weixin_51363326/…

【p2p】专利:P2p网络中数据传输的方法、电子设备、装置、网络架构

基于混合CDN的低延时直播P2P技术实践 huya 大佬们的讲座。 而且发表了很多专利: 2018年的,点击直接阅读。 本文是学习笔记 本申请公开了P2P网络中数据传输的方法、电子设备、装置、网络架构,该方法包括步骤:接收服务器发送的数据包,所述数据包由共享资源拆分而成,并由服务…

金山轻维表项目进展自动通知

项目经理作为项目全局把控者,经常要和时间“赛跑”。需要实时了解到目前进展如何,跟进人是那些?哪些事项还未完成?项目整体会不会逾期?特别是在一些大型公司中,优秀的项目经理已经学会使用金山轻维表做项目…

05 Android基础--内部存储与外部存储

05 Android基础--内部存储与外部存储什么是内部存储,什么是外部存储?内部存储与外部存储的代码示例什么是内部存储,什么是外部存储? 1.内部存储与外部存储的存储介质: 内部存储的介质:RAM(内存) 内部ROM …

【连接池】什么是HikariCP?HikariCP 解决了哪些问题?为什么要使用 HikariCP?

文章目录什么是连接池什么是HikariCPHikariCP 解决了哪些问题?为什么要使用 HikariCP?HikariCP 的使用Maven支持数据库什么是连接池 数据库连接池负责分配、管理和释放数据库的连接。 数据库连接复用:重复使用现有的数据库长连接&#xff0…

PayPal轮询收款的那些事儿

想必做跨境电商独立站的小伙伴,对于PayPal是再熟悉不过了,PayPal是一个跨国际贸易的支付平台,对于做独立站的朋友来说跨境收款绝大部分都是依赖PayPal以及Stripe条纹了。简单来说PayPal跟国内的支付宝有点类似,但是PayPal它是跨国…

攒了一冬的甜,米易枇杷借力新电商走出川西大山

“绿暗初迎夏,红残不及春。魏花非老伴,卢橘是乡人。”苏轼文中的卢橘,就是枇杷,在苏轼看来,相较于姚黄魏紫,来自故乡四川的枇杷更为亲近。 四川省攀枝花市米易县是全国枇杷早熟产区之一,得益于…

【存储】RAID2.0+、多路径技术、磁盘可靠性技术

RAID2.0RAID 2.0技术RAID技术发展RAID 2.0软件逻辑对象RAID 2.0基本原理硬盘域Storage Pool & TierDisk Group(DG)LD(逻辑磁盘)Chunk(CK)Chunk Group(CKG)ExtentGrainVolume &am…

米尔Zynq 7000系列单板的FPGA农业生产识别系统

随着农业生产模式和视觉技术的发展,农业采摘机器人的应用已逐渐成为了智慧农业的新趋势,通过机器视觉技术对农作物进行自动检测和识别已成为采摘机器人设计的关键技术之一,这决定了机器人的采摘效果和农场的经济效率。目前市面上最常见的是基…

MATLAB-Scatter3-三维散点图投影至XYZ三个平面

MATLAB-Scatter3函数可以绘制立体的三维散点图,但有时候需要在该立体图中分析X-Y-Z三者的关系,即1副图呈现出4个信息,XYZ综合信息、XY信息、XZ信息、YZ信息。现有的Scatter3无法实现该功能,本文可实现Scatter3三维立体散点图在三个…

纯手动搭建大数据集群架构_记录011_搭建Nifi_安装部署_搭建集群---大数据之Hadoop3.x工作笔记0172

可以看到左侧,把nifi安装包先上传到服务器,然后,去解压,一样放到opt/software目录,然后解压到/opt/module目录 然后去修改这个配置文件nifi.properties,然后 然后nifi.web.http.port=58080 这里只把 nifi.web.http.port=8080 这个端口改成 58080就可以了. 然后我们进入nifi的bi…

《计算机系统基础》——数据的表示

文章目录《计算机系统基础》——数据的表示移码整数无符号整数 (Unsigned integer)带符号整数(Signed integer)测试代码浮点数表示范围IEEE 754标准例子规格化数0∞/-∞非数非规格数《计算机系统基础》——数据的表示 移码 🚀🚀…

2023年中国人工智能产业趋势报告

易观:尽管2022年人工智能市场发展活跃度不及预期,但2022年对人工智能产业来说无疑是令人激动的一年。年中由DALL-E 2以及其后Stable Diffusion和Midjourney等文本-图像生成模型引起公众对人工智能生成内容的大量关注,年末ChatGPT的横空出世刷…

硬件系统工程师宝典(13)-----PCB的布局“有讲究”

各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。上篇我们说到EMC的标准以及提高EMC性能的一些常用方法。今天我们来看看PCB上模块的布局有什么讲究。 模块划分及布局 PCB上模块的划分和布局会影响到…

ATTCK v12版本战术实战研究—持久化(二)

一、前言前几期文章中,我们介绍了ATT&CK中侦察、资源开发、初始访问、执行战术、持久化战术的知识。那么从前文中介绍的相关持久化子技术来开展测试,进行更深一步的分析。本文主要内容是介绍攻击者在运用持久化子技术时,在相关的资产服务…