创建索引使用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. tips[Android]

    View:2D graphics,SurfaceView:3D graphics. ProgressBar进度渐进动画,可以使用ObjectAnimator实现.动画相关的类: android.vie ...

  2. sql server windows账号不能登陆指定的数据库

    问题描述: 1. windows账号登陆后,默认的数据库被删除 2. SA账号密码也忘记了 此时就会导致用windows账号登陆Sql Server的时候,返回4064的错误,按照上面的问题描述,应该 ...

  3. Solr-4.10.2与Tomcat整合

    1.将下载的solr解压至D:\solr,拷贝d:\solr\solr-4.10.2\example\webapps\solr.war到Tomcat的webapps\目录中.直接解压 solr.war ...

  4. zeromq源码分析笔记之线程间收发命令(2)

    在zeromq源码分析笔记之架构说到了zmq的整体架构,可以看到线程间通信包括两类,一类是用于收发命令,告知对象该调用什么方法去做什么事情,命令的结构由command_t结构体确定:另一类是socke ...

  5. nodejs 保存 payload 发送过来的文件

    1:接受文件 http://stackoverflow.com/questions/24610996/how-to-get-uploaded-file-in-node-js-express-app-u ...

  6. 新浪短链接API接口示例

    <?php /** * URL地址长短切换,由sina新浪短链接API生成 * User: chenqt * Date: 2016/8/23 * Time: 18:45 */ class Url ...

  7. php的一些小笔记-文件函数(1)

    ---恢复内容开始--- 与文件操作相关的函数有一部分可以和linux命令比较,但是我觉得可能还是linux上使用的比较频繁 如:chown,chmod,chgrp,rename,touch,link ...

  8. Android新建项目手动添加Layout布局

    前言: 这是看<第一行代码>学习到的第一章,之前使用Eclipse创建Android项目都是自动生成MainActivity.java文件和layout文件夹下的activity_main ...

  9. SVN上传代码时代码失败

    Description : You are not authorized to access the files in the repository.Suggestion : You might be ...

  10. 在Android模拟器中经常出现以下错误 timeout Launch canceled!

    Failed to install MainActivity.apk on device 'emulator-5554': timeoutLaunch canceled! 解决方法: window-& ...