创建索引使用ensureIndex方法,对于同一个集合,同样的索引只需要创建一次,反复创建是徒劳的。

对某个键的索引会加速对该键的查询,然而,对于其它查询可能没有帮助,即便是查询中包含了被索引的键。实践证明,一定要创建查询中用到的所有键的索引

一般来说,如果索引包含N个键,则对于前几个键的查询都会有帮助,如有个索引{"a":1,"b":1,"c":1},实际上是有了{"a":1}、{"a":1,"b":1}、{"a":1,"b":1,"c":1}等的索引,但是使用{"b":1}、{"a":1,"c":1}等索引的查询则不会被优化,只有使用索引前部的查询才能使用该索引。

MongoDB的查询优化器会重排查询项的顺序,以便利用索引

有时,最有效的方法不是使用索引,一般来说, 要是查询要返回集合中一半以上的结果,用表扫描会比几乎每条文档都查索引要高效一下。

建立索引时要考虑如下问题:

1.会做什么样的查询?其中哪些键需要索引?

2.每个键的索引方向是怎样的?

3.如何应对扩展?有没有种不同的键的排列可以使常用数据更多的保留在内存中?

为内嵌文档的键建立索引和普通的键创建索引没有什么区别。

随着集合的增长,需要针对查询中大量的排序做索引,如果对没有索引的键调用sort,MongoDB需要将所有数据提取到内存来排序,因此,可以做无索引排序是有个上限的,一旦集合大到不能在内存中排序,MongoDB就会报错。按照排序来索引以便让MongoDB按照顺序提取数据,这样就能排序大规模数据。

集合中的每个索引都有一个字符串类型的名字,来唯一标识索引,服务器通过这个名字来删除索引或者操作索引,默认情况下,索引名字类似keyname1_dir1_keyname2_dir2_..._keynameN_dirN这种形式,其中keynameX代表索引的键,dirX代表索引的方向(1或者-1),索引名有个字符个数限制,所以特别复杂的索引在创建时一定要使用自定义的名字。

创建唯一索引,如果没有对应的键,索引会将其作为null存储,所以,如果对某个键建立了唯一索引,但插入了多个该索引键的文档,则由于文档包含null值而导致插入失败。

explain会返回查询使用的索引情况(如果有),耗时及扫描文档数的统计信息【3.0中没看出来啊】

MongoDB的查询优化器会选择使用哪个索引,初次做某个查询会同时尝试各种查询方案,最先完成的被确定使用,其它的则终止掉。

查询方案被记录下来,以备日后应对相同键的查询,查询优化器定期重试其它方案,以防因为添加新的数据后,之前的方案不再是最优的,。

如果发现MongoDB使用了非预期的索引,可以用hit强制使用某个索引。

system.indexes集合包含每个索引的详细信息,查看集合发现每个集合至少有两个文档与之对应,一个集合本身,一个对应集合包含的索引,对于只有标准的"_id"索引的集合,如图:【集合名的长度不能超过121字节,集合名和索引名加起来不能超过127字节】

建立索引既耗时也费力,还需要消耗很多资源,使用{"background":true}选项可以使这个过程在后台完成,同时正常处理请求,要是不包括background这个选项,数据库会阻塞建立索引期间的所有请求。阻塞的做法会让索引建立的更快,后台创建索引也会增加些负载,好在不会让服务器停机。为已有文档创建索引比先创建索引在插入所有文档要稍快一点。

找到离当前位置最近的N个场所,MongoDB为坐标平面查询提供了专门的索引,称为地理空间索引。该索引同样使用ensureIndex来创建,只不过参数不是1或-1,而是“2d”

“gps”键的值必须是某种形式的一对值:一个包含两个元素的数组或是包含两个键的内嵌文档

地理空间查询以两种方式进行,即普通查询(find)或者使用数据库命令

MongoDB不但能找到靠近一个点的文档,还能找到指定形状内的文档,具体做法将原来的"$near"换成"$within"

创建复合的地理空间索引

db.map.ensureIndex({"location":"2d","desc":1})

MongoDB学习笔记04的更多相关文章

  1. MongoDB学习笔记-04 索引

    索引是用来加速查询的.有了索引之后,数据库不必进行全表扫描,只需先在索引中查找,再根据找到的索引查找数据.MongoDB的索引几乎和传统关系型数据库一样. 创建索引 创建索引是在相应的集合中使用ens ...

  2. mongodb 学习笔记 04 -- 游标、索引

    游标 var cursor = db.collectionName.find() 创建游标 cursor.hasNext() 是否有下一个元素 cursor.next() 取出下一个元素 比如 whi ...

  3. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  4. PHP操作MongoDB学习笔记

    <?php/*** PHP操作MongoDB学习笔记*///*************************//**   连接MongoDB数据库  **////*************** ...

  5. MongoDB 学习笔记(原创)

    MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...

  6. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

  7. MongoDB学习笔记(转)

    MongoDB学习笔记(一) MongoDB介绍及安装MongoDB学习笔记(二) 通过samus驱动实现基本数据操作MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB ...

  8. 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)

    机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...

  9. 【转】MongoDB学习笔记(查询)

    原文地址 MongoDB学习笔记(查询) 基本查询: 构造查询数据. > db.test.findOne() { "_id" : ObjectId("4fd58ec ...

随机推荐

  1. scala中的view bound与context bound

    1.scala中的<%意识是“view bounds”(视界) ,它比<:的使用范围更广,还能进行隐式转换,是一种语法糖. 下面的两种写法是等效的,在编译之后完全一样. object Te ...

  2. 注意:"AspNetPager”的控件“AspNetPager1”必须放在具有 runat=server 的窗体标记内

    应加: <form id="form1" runat="server"> </form> 否则一开始什么也不显示,页面控件看不见,加上a ...

  3. 华为oj - 统计大写字母个数

    练手而已. 给初学者参考 #include <stdio.h> #include <string.h> int main(void) { char string[200]={' ...

  4. html label 标签的 for 属性

    如果您在 label 元素内点击文本,就会触发此控件.就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上. 有两种使用方法: 方法1 使用for属性 <label for ...

  5. 在js中使用json

    在js中使用json var obj = {     "1" : "value1",     "2" : "value2" ...

  6. 基于ViewPager的一些酷炫切换效果

    1.ViewPager可以用于实现类似banner的功能,我曾经在“时间超市”项目中使用过.但如何在此基础上实现一些切换的酷炫效果呢?今天细细品读了鸿洋大神的相关博文,终于学会了如何自定义切换效果. ...

  7. mysql 5.7 内存使用监控

    5.7 中的performance_schema 已经有能力监控mysql 的内存使用情况了,对于这一点也是要通过instrument 来实现的,由于内存这一块没有对应的consumer 所以只要 配 ...

  8. 统计的基本操作语法 <第五篇>

    1.创建统计语法: CREATE STATISTICS statistics_name ON { table_or_indexed_view_name } ( column [ ,...n ] ) [ ...

  9. PowerShell常用的属性

    get-location | get-member  -membertype  property -------获取对象的属性---------- 获取对象特定的成员, 湖区.Net Framwork ...

  10. 图解SSL/TLS协议(转)

    本周,CloudFlare宣布,开始提供Keyless服务,即你把网站放到它们的CDN上,不用提供自己的私钥,也能使用SSL加密链接. 我看了CloudFlare的说明(这里和这里),突然意识到这是绝 ...