文档章节

MongoDB索引概述

晨曦断罪
 晨曦断罪
发布于 2016/12/28 12:47
字数 1100
阅读 4
收藏 0

数据库索引与书籍的索引类似。有了索引就不需要反正本书,数据库可以直接在索引中查找。在索引中找到条目后就可以直接跳转到目标文件中,这能使查找速度提高几个数量级。

复合索引

1.建立

db.user.ensureIndex({“age”:1,”username”:1});

每一个索引条目都包含一个“age”字段和一个“username”字段,并且指向文档在磁盘上的存储位置(重点)。

2.使用

mongodb对这个索引的使用方式取决于查询的类型。下面是三种主要的方式。

db.users.find({“age”:21}).sort({“username”:-1})
//点查询 索引中第二个字段是有序的,可以逆序遍历索引而不用在内存中排序
//排序方向并不重要:mongodb可以在任意方向上对索引进行遍历

db.users.find({“age”:{“ gte":21," lte”:30}})
//多值查询,范围查询。会使用索引的第一个字段。按照索引顺序排列的。

db.users.find({“age”:{“ gte":21," lte”:30}}).sort({“username”:1})
//本次查询可以用到上索引的第一个字段,但需要在内存中排序,所以施非高效的。
可以使用这个索引。可以通过hint指定查询所需要的索引。
db.user.ensureIndex({“username”:1”,”age”:1});

若对查询结果的范围做了限制,那么mongodb在几次匹配之后就可以不再扫描索引。
//对于这句话,我个人认为第二种索引目的文档是在一起的,当找到第一部分后,可以继续读取下面的文档,而不必再去遍历整个索引来查找。
在这种情况下,将排序见放在第一位是一个非常好的策略。
在一般的小型集合中第一种占优,但不利于扩展,所以当集合足够到时,建议创建常用排序键在前的索引,这样的索引更利于扩展。

//这样的索引树被称为右平衡索引。

3.索引数组和内嵌文档

索引内嵌文档。

db.users.ensureIndex({“loc”:1})

索引内嵌文档的字段,要用到点语法。

db.users.ensureIndex({“loc.city”:1})

对嵌套文档本身建立索引和对嵌套文档的某个字段建立索引是不同的。
只有在与子文档字段顺序完全匹配的子文档查询时,才会应用到。

索引数组,可以高效的搜索数组中的特定元素。

db.users.ensureIndex({“comments.date”:1})

注意mongodb的数组索引在同一个索引中不能大于一,也就是说每个索引做多包含一个数组索引,以防索引爆炸性增长。

索引基数指的是某个键所对应不同值得数量。基数越高,这个键上的索引越有效,应高尽量将基数高的索引放在复合索引的前面。

注意:数组索引被标记为多键索引,指向的文档很大可能会重复(将这个键设置为复合唯一索引自动去重),所以必须要去重。更改的方式为删除新建,不能直接更改。

4.索引种类

唯一索引
创建:

db.users.ensureIndex({“username”:1},{“unique”:true});

当创建唯一索引时,有可能失败的原因大概是因为已经存在重复的值。

在极少情况下,可能希望直接删除重复的值。创建索引时使用”dropDups“
选项,当遇到重复的值时,保留第一个,删除剩下的重复文档。

db.users.ensureIndex({“username”:1},{“unique”:true,”dropDups”:true});

稀疏索引
唯一索引会把null看做值,所以无法将多个缺少唯一索引中的键的文档插入到集合中。然而,在有些情况下,你可能希望唯一索引只对包含相应的文档生效。如果有一个可能存在可能不存在的字段(例如唯一的绑定邮箱或者手机等等),但是当他存在时必须是唯一的,可以讲unique和sparse选项组合起来使用。

db.users.ensureIndex({“username”:1},{“unique”:true,”sparse”:true})

5.索引管理

可以在system.indexes中看到它的元信息,可以执行db.collectionName.getIndexes()来查看给定集合上的所有索引信息。

6.标识索引

db.users.ensureIndex({“username”:1},{“name”:”username”})

7.修改索引

db.users.dropIndex(“username”)
用索引描述信息中的name字段来指定需要删除的索引。

© 著作权归作者所有

晨曦断罪
粉丝 0
博文 16
码字总数 12398
作品 0
石家庄
程序员
私信 提问
MongoDB 3.0新特性概述

MongoDB 在 2015年3月3日 跳过了 MongoDB 2.8版本,直接在 MongoDB 2.6版本后,发布了MongoDB 3.0版本。 随后在 2015年3月17日 发布了 MongoDB 3.0.1 版本; 在 2015年4月9日发布了 MongoDB ...

xinsir999
2018/05/02
0
0
MongoDB 1000W级数据 Insert和Query和Delete性能测试(分别测试 不加索引 和 加索引)

先看下测试机性能(64bit): 测试程序: 不加索引测试: ......................# MongoDB 不加索引 插入1000W条测试 #................... ......................# MongoDB 不加索引 1000...

晨曦之光
2012/04/12
2.7K
1
mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、等等)

最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的...

Airship
2018/06/01
168
0
在CentOS7上部署MongoDB分片群集

MongoDB分片概述 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读...

xuyan184004
2018/09/19
0
0
《阿里巴巴MongoDB4.0高级实战:基于Java Spring Boot 2.0》运维、监控、聚合、集群、监控等高级面试题

《阿里巴巴MongoDB4.0高级实战》阿里巴巴技术大牛 资深专家P9叶翔、专家徐雷. NoSQL排名第一!最流行的NoSQL数据库;谷歌、阿里巴巴、蚂蚁金服、腾讯、百度等一线互联网公司必备技能。 本系列...

徐雷frank
2018/11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何编写高质量的 JS 函数(1) -- 敲山震虎篇

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/7lCK9cHmunvYlbm7Xi7JxQ 作者:杨昆 一千个读者,有一千个哈姆雷特。 此系列文章将会从函数的执行机制、鲁棒性、函...

vivo互联网技术
43分钟前
5
0
学会这5个Excel技巧,让你拒绝加班

在网上,随处都可以看到Excel技巧,估计已看腻了吧?但下面5个Excel技巧会让你相见恨晚。关键的是它们个个还很实用 图一 技巧1:快速删除边框 有时当我们处理数据需要去掉边框,按Ctrl+Shif...

干货趣分享
今天
11
0
JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
9
0
高防CDN的出现是为了解决网站的哪些问题?

高防CDN是为了更好的服务网络而出现的,是通过高防DNS来实现的。高防CDN是通过智能化的系统判断来路,再反馈给用户,可以减轻用户使用过程的复杂程度。通过智能DNS解析,能让网站访问者连接到...

云漫网络Ruan
今天
15
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
3.3K
25

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部