MongoDB(课时21 索引)
3.5 索引(重点)
任何数据库中,索引都是一种提升数据库检索性能的手段,这一点在MongoDB数据库中同样是存在的,MongoDB数据库里面存在两种索引创建:一是自动创建,另外是手工创建。
范例:重新准备一个新的简单集合

此时在students集合上并没有设置任何的索引,下面通过getIndexes()函数来观察在students集合里面已经存在的索引内容。
范例:查询默认状态下的students集合的索引内容
db.students.getIndexes()

会发现存在一个“_id”列的索引内容。"V"表示索引版本;"_id" : 1中的1表式升序排序;"name"是在字段"_id"后面加上下划线;"ns"是指在test.students集合下。
创建自己的索引:
语法:db.集合名称.ensureIndex({列 : 1})
设置的1表示索引按照升序的方式进行排列,如果使用降序设置“-1”。
范例:创建一个索引,在age字段上设置一个降序索引
db.students.ensureIndex({"age" : -1})

此处的索引名并没被创建,是自动命名的。命名规范:“字段名称_索引的排序模式”

"name" : "age_-1"中name由字段名age加上下划线,再加上索引排序模式(-1表示降序)组成。
范例:针对当前的age字段上的索引做一个分析
db.students.find({"age" : 19}).explain()

表示界定值;"IXSCAN"表示索引扫描(index scan)。
范例:针对score字段上设置查询(不使用索引号)
db.students.find({"score" : {"$gt" : 90}}).explain()

"COLLSCAN"表示集合扫描(collection scan),即全表扫描。
此时在score字段上并没有设置索引,所以当前的索引形式变为全集合扫描的模式。
范例:年龄和成绩一起执行判断查询
db.students.find({"$or" : [{"age" : {"$gt" : 19}}, {"score" : {"$gt" : 90}}]}).explain()

由于age,score字段上没有索引,所以使用全表扫描,那么为了解决此时问题,可以使用一个复合索引。
db.students.ensureIndex({"age" : -1, "score" : -1}, {name : "age_-1_score_-1_index"})

范例:使用默认索引
db.students.find({"age" : 19, "score" : 90}).explain()


但是如果换到条件之中:
db.students.find({"$or" : [{"age" : {"$gt" : 19}}, {"score" : {"$gt" : 90}}]}).explain()
现在发现并没使用索引,所以这个时候看能否强制使用一次索引。hint()函数为强制使用索引操作。
范例:强制使用索引
db.students.find({"$or" : [{"age" : {"$gt" : 19}}, {"score" : {"$gt" : 90}}]}).hint({"age" : -1, "score" : -1}).explain()


如果正常来讲,这个代码不可能调用默认的索引执行,但是我们觉得不好,所以需要使用hink()强制使用索引。由于此时在age和score两个字段上已经设置了符合索引,现在使用的就是默认的符合索引。
将降序变为升序,即-1变为1:
db.students.find({"$or" : [{"age" : {"$gt" : 19}}, {"score" : {"$gt" : 90}}]}).hint({"age" : 1, "score" : 1}).explain()

这样是错误的。hint()的操作必须用指定字段上绑定的索引结果来运行,指定字段age,score本来绑定的是-1,不能用1来运行。
但是如果在一个集合里设置过多的索引,会导致性能下降,可以删除索引。
范例:删除一个索引
db.students.dropIndex({"age" : -1, "score" : -1})


只是一个一个删除索引也会很麻烦,所以提供有删除全部索引的操作。
范例:删除全部索引
db.students.dropIndexes()
所谓删除全部索引指的就是非“_id”的索引,即所有自定义索引。
MongoDB(课时21 索引)的更多相关文章
- MongoDB的学习--索引
索引可以用来优化查询,而且在某些特定类型的查询中,索引是必不可少的.为集合选择合适的索引是提高性能的关键. 先来mock数据 for (i = 0; i < 1000000; i++) { db ...
- mongodb的地理位置索引
mongoDB支持二维空间索引,使用空间索引,mongoDB支持一种特殊查询,如某地图网站上可以查找离你最近的咖啡厅,银行等信息.这个使用mongoDB的空间索引结合特殊的查询方法很容易实现.前提条件 ...
- MongoDB的学习--索引类型和属性(转)
原文链接:MongoDB的学习--索引类型和属性 索引类型 MongDB的索引分为以下几种类型:单键索引.复合索引.多键索引.地理空间索引.全文本索引和哈希索引 单键索引(Single Field I ...
- 深入理解MongoDB的复合索引
更新时间:2018年03月26日 10:17:37 作者:Fundebug 我要评论 对于MongoDB的多键查询,创建复合索引可以有效提高性能.这篇文章主要给大家介绍了关于MongoDB复 ...
- MongoDB学习笔记~索引提高查询效率
回到目录 索引这个东西大家不会陌生,只要接触到稍微大一点的数据,都会用到这东西,它可以提升查询的速度,相当代价就是占用了更多的存储空间,这也是正常的,符合“能量守恒定理”,哈哈!今天说的是MongoD ...
- MongoDB学习笔记(索引)
一.索引基础: MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令: > db.test.ensureIndex({" ...
- MongoDB学习笔记(索引)(转)
一.索引基础: MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令: > db.test.ensureIndex({" ...
- MongoDB学习笔记——索引管理
索引 索引能够提升查询的效率.没有索引,MongoDB必须扫描集合中的所有文档,才能找到匹配查询语句的文档. 索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式.索引能够存储某种特殊字段或字 ...
- 课时21:函数:lambda表达式
目录: 一.lambda表达式 二.介绍两个BIF:filter()和map() 三.课时21课后习题及答案 ********************* 一.lambda表达式 *********** ...
随机推荐
- libSVM简介及核函数模型选择
1. libSVM简介 训练模型的结构体 struct svm_problem //储存参加计算的所有样本 { int l; //记录样本总数 double *y; //指向样本类别的组数 struc ...
- QC质量管理七大手法
1.层别法 层别法就是将大量有关某一特定主题的观点.意见或想法按组分类,将收集到的大量的数据或资料按相互关系进行分组,加以层别.层别法一般和柏拉图.直方图等其它七大手法结合使用,也可单独使用. 2.查 ...
- 机器学习理论基础学习17---贝叶斯线性回归(Bayesian Linear Regression)
本文顺序 一.回忆线性回归 线性回归用最小二乘法,转换为极大似然估计求解参数W,但这很容易导致过拟合,由此引入了带正则化的最小二乘法(可证明等价于最大后验概率) 二.什么是贝叶斯回归? 基于上面的讨论 ...
- 怎么把<li>标签里的内容付给文本框
如果你不想使用jq,那就可以这样先写一个js函数,function val(a){alert(a);} 然后在li标签上添加点击事件,调用这个函数并将当前li里的文本当做参数一起发送给js函数< ...
- Summary: Difference between null and empty String
String s1 = ""; means that the empty String is assigned to s1. In this case, s1.length() i ...
- Perl的debug小技巧
进入Perl的调试环境的命令: Perl -d perl_file 设置断点:b + perl代码中的行号. 执行到断点:c 表示continue until breakpoint. 执行下一条 ...
- 20145307陈俊达《网络对抗》Exp 8 Web基础
20145307陈俊达<网络对抗>Exp 8 Web基础 基础问题回答 1.什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中输入信息的元素,表单在网页中主要负责数据采 ...
- 20145336张子扬《网络对抗》MSF基础应用
20145336张子扬 <网络对抗>MSF基础应用 实验一:主动攻击,利用ms08_067漏洞进行攻击 首先使用use exploit/windows/smb/ ms08_067 _net ...
- 写一个标准宏MIN,输入两个参数,返回较小的
#define MIN(A,B) ((A) <= (B) ? (A) : (B))MIN(*p++, b)会产生宏的副作用 剖析: 这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函 ...
- 安装PYthon+Kivy环境(记录)
在线翻译 https://www.bing.com/translator/ Cython 0.27 发布了.准确说Cython是单独的一门语言,专门用来写在Python里面import用的扩展库.实际 ...