准备工作: 先插入100万条数据

for(i=0;i<=1000000;i++){
db.users.insert({
"i":i,
"username":"user"+i,
"age":Math.floor(Math.random()*120),
"created":new Date()
}) }

1. 创建索引: 数据量越大创建索引时间越长

db.users.ensureIndex({"username":1})
db.users.find({"username":"user234455"}).explain()

 查询速度飞快...O(∩_∩)O~
使用索引的代价:  添加一个索引,每次插入,更新,删除操作都会耗费更多时间;原因是数据变动时mongodb每次都要更新文档和索引. 在一个集合上通常不应该拥有两个以上的索引.
在常用的键上建立索引.
2. 复合索引:就是建立在多个键上的索引
    (索引在排序时非常快,前提是首先使用索引键排序)
db.users.ensureIndex({"username":1,"age":1})//每个索引都包含 age 和 name字段

三种使用方式:  (mongodb可以在任意方向上对索引进行遍历)

(1) 点查询,这种最高效

db.users.find({"age":21}).sort({"username":-1})

(2) 多点查询: 使用索引查询出来的结果是无序的,mongodb需要在内存中重新排序,然后返回.问题:结果集文档数量比较大,查询速度会慢;结果集超过32M,mongodb会出错

db.users.find({"age":{"$gte":20,"$lte":30}}).sort({"username":1})

(3) 使用另一个索引 {"username":1,"age":1} 可以使用hint强制使用某个索引

db.users.find({"age":{"$gte":20,"$lte":30}}).sort({"name":1}).explain()
db.users.find({"age":{"$gte":20,"$lte":30}}).sort({"name":1}).hint({"name":1,"age":1}).explain()

索引本质上是: 树,最小的值在最左边,最大的值在最右边.

(4) 只有在基于多键排序的时候,方向才变得重要.

(5) 覆盖索引: 索引中已经包含了要查找的字段;

(6) 复合索引: 对不同的查询表现为不同的索引:, {"age":1,"username":1},可以"免费" 获取以age这个键开头的所有索引;

(7) $where和检查一个键是否存在 无法使用索引; 在索引中不存在的字段和null字段的存储方式是一样的.

(8)查询: 将精确匹配的字段放在前面,将范围匹配的字段放在最后;

(9)$or: 可以对每个子句都使用索引,因为实际上$or执行两次查询然后将结果集合并,效率不高,尽可能使用 $in

$or需要每次检查查询的结果集并且将重复的文档移除.

(10)索引嵌套文档:

db.users.ensureIndex({"loc.city":})

(11)对数组简历索引: 对数组建立索引实际上就是对数组中每一个元素建立索引条目,而不是对数组本身建立索引,一个索引中的数组字段最多只有一个.
(12) 索引基数: 就是集合中每个字段拥有不同值得数量.应该再基数比较高的字段上建立索引.

(13)explain()  可以提供大量与查询有关的信息;如果scanAndOrder为true,那么说明没有使用索引,mongodb需要再内存中排序,这回很慢

hint() 强行使用某个索引

db.users.find({"age":}).hint({"age":})

3. 何时不应该使用索引: 结果集在原集合中所占比重越大,索引速度就越慢. 一般来说: 查询需要返回结果集30%的就需要比较 全表扫描和索引查找的速度...
    索引查找: 索引需要进行两次查找,一次是查找索引条目,一次是根据索引条目查找相应文档; 使用{"$natural":1} 强制全表扫描

db.users.find({"age":28}).hint({"$natural":1})

4. 索引类型:
   (1) 唯一索引: (会把null看做值)

db.users.ensureIndex({"usename":1},{"unique":true})

复合唯一索引: 所有键的组合值必须是唯一的.

去除重复的索引:

db.users.ensureIndex({"usename":1},{"unique":true,"dropDups":true})

(2) 稀疏索引: (如果一个肯能存在也可能不存在的字段,当它存在时,它必须是唯一的),稀疏索引可以使唯一的.

db.users.ensureIndex({"email":1},{"sparse":true})

5. 索引管理: 数据库所有的索引都存储在system.indexes集合中; 索引顺序很重要: {"age":1,"username":1},{"username":1,"age":1}是不同的索引

db.users.getIndexes() //uses所有的索引都可以在这里查看

(1)索引标识:索引名称是唯一的. 可以自定义索引

db.users.ensureIndex({"usename":1},{"name":"myIndex"})

(2)删除索引: mongodb创建索引时会阻塞所有对数据的读写请求.一直到创建完毕

db.users.drop("username_1")

6. 固定集合...

 
 
 
 
 

mongodb学习(六)索引的更多相关文章

  1. MongoDB学习笔记~索引提高查询效率

    回到目录 索引这个东西大家不会陌生,只要接触到稍微大一点的数据,都会用到这东西,它可以提升查询的速度,相当代价就是占用了更多的存储空间,这也是正常的,符合“能量守恒定理”,哈哈!今天说的是MongoD ...

  2. MongoDB学习笔记(索引)

    一.索引基础:    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:    > db.test.ensureIndex({" ...

  3. MongoDB学习笔记(索引)(转)

    一.索引基础:    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:    > db.test.ensureIndex({" ...

  4. MongoDB学习笔记——索引管理

    索引 索引能够提升查询的效率.没有索引,MongoDB必须扫描集合中的所有文档,才能找到匹配查询语句的文档. 索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式.索引能够存储某种特殊字段或字 ...

  5. MongoDB学习 (六):查询

    本文地址:http://www.cnblogs.com/egger/archive/2013/06/14/3135847.html  欢迎转载 ,请保留此链接๑•́ ₃•̀๑! 本文将介绍操作符的使用 ...

  6. [转载]MongoDB学习 (六):查询

    本文地址:http://www.cnblogs.com/egger/archive/2013/06/14/3135847.html  欢迎转载 ,请保留此链接๑•́ ₃•̀๑! 本文将介绍操作符的使用 ...

  7. MongoDB 学习五:索引

    这章我们介绍MongoDB的索引,用来优化查询. 索引介绍 数据库索引有些类似书的目录. 一个查询如果没有使用索引被称为表扫描,意思是它必须像阅读整本书那样去获取一个查询结果.一般来说,我们应尽量避免 ...

  8. MongoDB学习day08--Mongoose索引、Mongoose内置方法、扩展Mongoose Model的静态方法和实例方法

    一.Mongoose索引 索引是对数据库表中一列或多列的值进行排序的一种结构, 可以让我们查询数据库变得更快. MongoDB 的索引几乎与传统的关系型数据库一模一样, 这其中也包括一些基本的查询优化 ...

  9. MYSQL数据库学习六 索引的操作

    6.1 索引 由于数据存储在数据库表中,所以索引是创建在数据库表对象上的,由表中的一个或多个字段生成的键组成,这些键存储在数据结构(B-树或哈希表)中,通过索引可以快速有效地查找与键值相关联的字段.根 ...

随机推荐

  1. zencart hosts本地解析

    C:\WINDOWS\system32\drivers\etc\hosts 127.0.0.1  www.aberc220.com   别人 192.168.1.64 www.aberc220.com ...

  2. mytest 截图

  3. hdu_2544_最短路(spfa版子)

    题目连接:hdu_2544_最短路 存个自己写的SPFA的板子 #include<cstdio> #include<cstring> #define mst(a,b) mems ...

  4. linux找回密码

    开机启动系统,在进入系统之前按键盘上面的Esc键,会进入下面的界面 按键盘上的e键,出现下面界面 用键盘上的方向键移动光标到第二项,然后再按键盘上面的e,会出现下面的界面 输入一个空格键,然后在输入数 ...

  5. PPTP-VPN日志功能,记录用户登录时间,流量统计,IP地址等信息

    我们先看两个文件 /etc/ppp/ip-up /etc/ppp/ip-down 这两个文件为shell脚本,当PPTP用户连接或者断开时分别执行这两个文件,并且会带相应的参数 这些参数有 $PEER ...

  6. github 教程

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/

  7. Android 手机应用开发经验 之 通过Socket(TCP/IP)与PC通讯

    Android 是一个开源的手机操作系统平台,已经被非常多的开发者视作未来最有潜力的智能手机操作系统.而且,在很短的时间内就在Android Market上出现大量的第三方应用程序,供用户下载与使用, ...

  8. CGI接口原理及实现(转载)

    原文:http://blog.csdn.net/duola_rain/article/details/15812585 CGI接口原理及实现(2012-12-7 Over) 1.CGI定义: CGI( ...

  9. 超级素数(sprime)

    超级素数(sprime) 题目描述 超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数为质数,例如:373->37->3这是一个长为3的超级素数. 输入 输入一个整数n (10≤n ...

  10. android开发中应该注意的问题

    1. Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效.   2. 数据库表段字段常量和SQL逻辑分离,更清 ...