索引是提高查询查询效率最有效的手段。索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中,所在从索引中检索数据会非常快。如果没有索引,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()
相关推荐
mongodb 安装 及分配配置 以及使用中遇到的情况
10天掌握MongoDB(2012翻新完整版),网上牛人整理的,我添加了书签,入门必备。
传智播客 赵强老师的Oracle课件 很实用 对于学习很有帮助
想要好好地学习Oracle数据库的朋友呀,你错过了她就太不值得了。里面有好多的Oracle操作命令可能你都没接触过吧。好了,话不多多说。坚信资料不错!你,值得拥有!OK.还有,之所有要你2分打赏,是我给了你这么好的...
精通JSP编程 作者赵强 ISBN号7121022893 3-11章节
精通JSP编程 作者赵强 编 12-18节
[1120][赵强精通JSP编程][37M],提供下载地址,经典的资料,书籍,绝对经典!
二年级数学生活中的大数赵强PPT课件.pptx
资料为2013 10份上课学习整理,对于初学者比较有用
二年级数学生活中的大数赵强PPT学习教案.pptx
教程名称:Oracle 数据库赵强视频教程【3天】教程目录:【】Oracle安装与管理、SQL语句(赵强)【】Orcale存储过程jdbc与Orcale大文本操作等(赵强)【】SQL简单查询触发器视图(赵强) 资源太大,传百度网盘了,链接在...
信息存储技术的发展赵强.doc
day2013-0110-webLogic配置和集群(赵强).zip,视频和文档齐全
LoadRunner性能测试巧匠训练营-完整版(带目录)-赵强邹伟伟无密码,解压就可看
游戏运营手册.pdf,赵强著,游戏运营,策划,游戏运营手册.pdf,赵强著,游戏运营,策划
1.1 主要平台首页用户浏览动机比较 1.2 用户浏览微信购物首页的痛点 1.3 不同平台用户痛点比较 1.4 用户在微信购物首页的内容需求 1.1 用户分群
java代码-46 赖赵强