网站首页 > 技术文章 正文
索引是提高查询查询效率最有效的手段。索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中,所在从索引中检索数据会非常快。如果没有索引,MongoDB必须扫描集合中的每一个文档,这种扫描的效率非常低,尤其是在数据量较大时。
一、索引的基础知识
下面以关系型数据库Oracle为例,介绍索引的基本原理,如下图所示:
从上图可以看成,索引的本质其实就相当于是一本书的目录。当查询表中数据的时候,先查询目录(索引)中的行地址,再通过行地址查询到表中的数据,从而提高查询的性能。
下图说明了在MongoDB中,索引在查询和排序中是如何工作的?
通过这个例子,可以清楚的看到索引存储的是一个特定字段或者几个字段的集合,并且按照一定的规律排序。当创建集合的时候,MongoDB自动在_id上创建一个唯一性索引,由于是唯一性的,所以可以防止重复的_id值插入到集合中。通过getIndexes可以查询到MongoDB集合上的索引信息,如下图所示。
当没有索引的时候,通过查看执行计划,可以看到查询的过程,如下:查询:10号部门,工资小于3000的文档。
那么如何创建一个简单的索引呢?注意从mongoDB 3.0开始ensureIndex被废弃,今后都仅仅是db.collection.createIndex的一个别名。
现在在deptno和sal上建立一个索引,并重新查看执行计划:db.emp.createIndex({"deptno":1,"sal":-1})
注意:除了可以使用explain()生成执行计划外,还可以有几个可选的参数,如下:
.explain("allPlansExecution")
.explain("executionStats")
.explain("queryPlanner")
二、索引的类型一:单键索引(Single Field)
单键索引是最普通的索引,与_id索引不同,单键索引不会自动创建。
准备数据:
db.testindex1.insert({"_id":1,"zipcode":1034,"location":{state:"NY",city:"New York"}})
在单个列上创建单键索引:
db.testindex1.createIndex({"zipcode":1})
在嵌套的列上创建单键索引
db.testindex1.createIndex({"location:state":1})
在内嵌的文档上创建单键索引
db.testindex1.createIndex({"location":-1})
这样将会把location作为一个整体。
三、索引的类型二:多键索引(Multikey Index)
多键索引与单键索引创建形式相同,区别在于字段的值。值具有多个记录,如数组。
如上图,基于集合上的数组创建多键索引,且数组为内嵌文档。
准备数据:
db.testindex2.insertMany([
{ _id: 5, type: "food", item: "aaa", ratings: [ 5, 8, 9 ] },
{ _id: 6, type: "food", item: "bbb", ratings: [ 5, 9 ] },
{ _id: 7, type: "food", item: "ccc", ratings: [ 9, 5, 8 ] },
{ _id: 8, type: "food", item: "ddd", ratings: [ 9, 5 ] },
{ _id: 9, type: "food", item: "eee", ratings: [ 5, 9, 5 ] }])
下面基于ratings列创建一个多键索引:
db.testindex2.createIndex( { ratings: 1 } )
查询数组上为5,9的文档
db.testindex2.find( { ratings: [ 5, 9 ] } )
下面查看其执行计划
db.testindex2.find( { ratings: [ 5, 9 ] } ).explain()
- 上一篇: 《从实践中学习oracle/SQL》读书笔记 7
- 下一篇: SQL索引使用 sql索引使用场景
猜你喜欢
- 2024-11-14 MySQL 索引原理详解 mysql索引规则详解
- 2024-11-14 阿里面试官:什么是MySQL索引,为什么要有索引?
- 2024-11-14 为什么索引可以让查询变快?终于有人说清楚了
- 2024-11-14 SQL索引使用 sql索引使用场景
- 2024-11-14 《从实践中学习oracle/SQL》读书笔记 7
- 2024-11-14 SQL查询优化,MySQL创建索引原则,什么时候不走索引?
- 2024-11-14 我以为自己对索引很了解,直到我遇到了阿里面试官
- 2024-11-14 sql添加索引 sql添加索引的作用
你 发表评论:
欢迎- 612℃几个Oracle空值处理函数 oracle处理null值的函数
- 603℃Oracle分析函数之Lag和Lead()使用
- 592℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 589℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 583℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 576℃【数据统计分析】详解Oracle分组函数之CUBE
- 566℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 558℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- PageHelper - 最方便的 MyBatis 分页插件
- 面试二:pagehelper是怎么实现分页的,
- MyBatis如何实现分页查询?(mybatis-plus分页查询)
- SpringBoot 各种分页查询方式详解(全网最全)
- 如何在Linux上运行exe文件,怎么用linux运行windows软件
- 快速了解hive(快速了解美国50个州)
- Python 中的 pyodbc 库(pydbclib)
- Linux搭建Weblogic集群(linux weblogic部署项目步骤)
- 「DM专栏」DMDSC共享集群之部署(一)——共享存储配置
- 故障分析 | MySQL 派生表优化(mysql pipe)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)