第26章:MongoDB-索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
唯一索引unique:保证数据的唯一不重复
稀疏索引sparse
TTL 索引:设置文档的缓存时间,时间到了会自动删除掉
全文索引:便于大文本查询(如概要、文章等长文本)
复合索引:用于提高查询速度
二维平面索引:便于2d平面查询
地理空间索引:便于地理查询
索引的选项
name:"", 自定义索引的名称,不配置系统会有默认的索引名
--db.students.ensureIndex({"name":"张三"},{"name":"myindex"});
background: true, 默认是前台模式, 创建索引是一件即费事又耗费资源的事情,创建索引是在前台模式或者后台模式下创建,在前台模式下创建非常快,但是当有读写请求时会堵塞,在后台模式下当有读写请求时并不堵塞,但是创建索引就会暂时暂停,后台模式要比前台模式慢的多
unique: true,唯一索引
dropDups: true,是否强制删除其他重复的文档,默认不删除,当索引键值重复时创建失败
sparse: true, 稀疏索引: 只对包含了该索引键的文档生成索引条目,不包含该键就跳过不生成索引键,可以和唯一索引配合使用,也可以单独使用
范例:
db.students.ensureIndex({"userid":"1"});
explain的字段说明:
1:cursor:本次查询使用的索引
2:isMultiKey:是否使用了多键索引
3:n:返回的文档数量
4:nscannedObjects:按照索引指针去磁盘查找实际文档的次数
5:nscanned:如果使用索引,就是查找过的索引条目数量;如果全表扫描,就是查找过的文档数量
6:scanAndOrder:是否在内存中对结果集排序
7:indexOnly:是否只是用索引就能完成本次查询
8:nYields:为了让写入请求能顺利执行,本次查询暂停的次数
9:millis:本次查询所耗费的时间,单位是毫秒
10:indexBounds:描述索引的使用情况,给出了索引的遍历范围
范例:
db.students.find({"name":"张三"}).explain();
范例:删除一个索引
db.students.dropIndex({"age"-1});
范例:删除全部索引--所谓的删除全部索引指的就是非"_id"的索引,所有的自定义索引。
db.students.dropIndexes();
索引键基数越大,效率越高。
基数:就是某个字段不同值的个数(相当于SQL中的 count(distinct key)),如性别就2个,如用户名和邮箱几乎都不同,所以不同值的个数就很多,基数越大,使用索引快速筛选掉不满足条件的文档越快,基数越小就不能快速筛选满足条件的文档
一些特殊的操作符不能使用索引,如 $where、$exists
一般取反的操作符索引利用率都比较低,如$not、$nin、$ne
如果能使用$in操作符尽量不要使用$or操作符,因为or: 是执行两次查询操作,然后将结果合并起来,类似于union all,能使用in(单次查询)就不要使用or操作符
如果查询要在内存中排序的话,结果集不能超过32M
MongoDB限制每个集合上最多只能有64个索引,建议在一个特定的集合上,不要设置多个索引。
第26章:MongoDB-索引的更多相关文章
- 学习MongoDB 八: MongoDB索引(索引限制条件)(二)
一.简介 我们上一篇介绍了索引基本操作,通过db.collection.createIndex(keys, options)语法创建索引,我们继续介绍地理空间索引.索引的限制,使我们在MongoDB时 ...
- [DataBase] MongoDB (7) MongoDB 索引
MongoDB 索引 1. 建立索引 唯一索引db.passport.ensureIndex( {"loginname": 1}, {"unique": tru ...
- MongoDB索引介绍
MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...
- MongoDB(索引及C#如何操作MongoDB)(转载)
MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureInd ...
- MongoDB索引(一)
原文地址 一.介绍 我们已经很清楚索引会提高查询效率.如果没有索引,MongoDB必须对全部集合进行扫描,即,扫描集合中每条文档以选择那些符合查询条件的文档.对查询来说如果存在合适的索引,则Mongo ...
- MongoDB 索引篇
MongoDB 索引篇 索引的简介 索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度.且添加索引之后的对文档的删除,修改会比以前速度慢.因为在进行修改的时候会对索引进行更新 ...
- 【RL-TCPnet网络教程】第26章 RL-TCPnet之DHCP应用
第26章 RL-TCPnet之DHCP应用 本章节为大家讲解RL-TCPnet的DHCP应用,学习本章节前,务必要优先学习第25章的DHCP基础知识.有了这些基础知识之后,再搞本章节会有事半功 ...
- MongoDB索引的种类与使用
一:索引的种类 1:_id索引:是绝大多数集合默认建立的索引,对于每个插入的数据,MongoDB都会自动生成一条唯一的_id字段2:单键索引: 1.单键索引是最普通的索引 2.与_id索引不同,单键索 ...
- MongoDB索引,性能分析
索引的限制: 索引名称不能超过128个字符 每个集合不能超过64个索引 复合索引不能超过31列 MongoDB 索引语法 db.collection.createIndex({ <field&g ...
- MongoDB索引原理
转自:http://www.mongoing.com/archives/2797 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下M ...
随机推荐
- Django的Modelforms的介绍
from django.forms import ModelForm class Test(ModelForm): # 把那张表转化成form组件 class Meta: # 这个意思即是把Artic ...
- day 22 反射,双下方法
反射: 反射:通过字符串去操作对象(类,空间等等)的属性或方法反射的四个方法 hasattr *** getattr *** setattr *** delattr *** # getattr 用法c ...
- AngularJS——第6章 作用域
第6章 作用域 在AngularJS中使用过滤器格式化展示数据,在"{{}}"中使用"|"来调用过滤器,使用":"传递参数. 6.1 内置过 ...
- mysql 事务中如果有sql语句出错,会导致自动回滚吗?
事务,我们都知道具有原子性,操作要么全部成功,要么全部失败.但是有可能会造成误解. 我们先准备一张表,来进行测试 CREATE TABLE `name` ( `id` int(11) unsigned ...
- Vue 数组 字典 template v-for 的使用
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- ubuntu下firefox打开mht文件
1.安装firefox插件:UnMHT 插件地址:http://www.unmht.org/unmht/en_index.html 2.用firefox打开mht文件
- 201621123008 《Java 程序设计》 第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1. List中指定元素的删除(题集题目) 1.1 实验总结.并回答:列举至 ...
- NC 6系初始化EJB
6系开发时,调用远程接口去操作数据时,需先调用EJB. InvocationInfoProxy.getInstance().setUserDataSource(design); InvocationI ...
- list,set等集合遍历时,不能remove集合中的元素。需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAll(list/set)操作
list,set等集合遍历时,不能remove集合中的元素.需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAl ...
- jquery查找frameset框架内iframe的元素
老系统还幸存有过时的frameset框架,维护升级工作需要对其内部的iframe中的元素进行相关操作.使用jquery查找子iframe页面内的元素时,总找不到目标元素.后来发现少了contents ...