一 . 索引概述和基本操作

1. 索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建索引
2. 在mongodb中,索引可以按字段升序/降序来创建,便于排序
3. 默认是用btree来组织索引文件,2.4版本以后,也允许建立hash索引.

常用命令:
查看当前索引状态: db.collection.getIndexes();

创建普通的单列索引:db.collection.ensureIndex({field:1/-1}); 1是升续 2是降续

删除单个索引
db.collection.dropIndex({filed:1/-1});

一下删除所有索引
db.collection.dropIndexes();

创建多列索引 db.collection.ensureIndex({field1:1/-1, field2:1/-1});

例子:

  1. > for (var i = ;i<=;i++){
  2. ... db.stu.insert({sn:i,name:'student'+i})
  3. ... };
  4. >
  5. >
  6. > db.stu.find().count();
  7.  
  8. > db.stu.find({sn:});
  9. { "_id" : ObjectId("574271a9addef29711337c28"), "sn" : , "name" : "student99" }
  10. > db.stu.find({sn:}).explain();
  11. {
  12. "cursor" : "BasicCursor", -- 无索引相当于mysql的全表扫描
  13. "isMultiKey" : false,
  14. "n" : ,
  15. "nscannedObjects" : , -- 扫描了1000
  16. ....
  17.  
  18. > db.stu.ensureIndex({sn:}); --创建索引
  19. > db.stu.find({sn:}).explain();
  20. {
  21. "cursor" : "BtreeCursor sn_1", --使用了索引
  22. "isMultiKey" : false,
  23. "n" : ,
  24. "nscannedObjects" : , --只用扫描一行
  25. ...
  26. }
  27.  
  28. > db.stu.getIndexes(); --查询索引
  29. [
  30. {
  31. "v" : ,
  32. "key" : {
  33. "_id" : -- 默认创建 正序
  34. },
  35. "ns" : "test.stu",
  36. "name" : "_id_"
  37. },
  38. {
  39. "v" : ,
  40. "key" : {
  41. "sn" :
  42. },
  43. "ns" : "test.stu",
  44. "name" : "sn_1"
  45. }
  46. ]
  47.  
  48. > db.stu.ensureIndex({sn:,name:});
  49. >
  50. >
  51. > db.stu.getIndexes();
  52. [
  53. {
  54. "v" : ,
  55. "key" : {
  56. "_id" :
  57. },
  58. "ns" : "test.stu",
  59. "name" : "_id_"
  60. },
  61. {
  62. "v" : ,
  63. "key" : {
  64. "sn" :
  65. },
  66. "ns" : "test.stu",
  67. "name" : "sn_1"
  68. },
  69. {
  70. "v" : ,
  71. "key" : {
  72. "sn" : ,
  73. "name" :
  74. },
  75. "ns" : "test.stu",
  76. "name" : "sn_1_name_1"
  77. }
  78. ]

二. 子文档索引

     指向下级嵌套的文档的索引

  1. > db.shop.insert({name:'Nokia',spc:{weight:,area:'taiwan'}});
  2. > db.shop.insert({name:'Nokia',spc:{weight:,area:'korea'}});
  3.  
  4. > db.shop.find({'spc.area':'taiwan'});
  5. { "_id" : ObjectId("5743d662addef29711337fb0"), "name" : "Nokia", "spc" : { "weight" : , "area" : "taiwan" } }
  6.  
  7. > db.shop.ensureIndex({'spc.area,1'});
  8. Tue May ::58.823 SyntaxError: Unexpected token }
  9. > db.shop.ensureIndex({'spc.area':});
  10. >
  11. > db.shop.getIndexes();
  12. [
  13. {
  14. "v" : ,
  15. "key" : {
  16. "_id" :
  17. },
  18. "ns" : "test.shop",
  19. "name" : "_id_"
  20. },
  21. {
  22. "v" : ,
  23. "key" : {
  24. "spc.area" :
  25. },
  26. "ns" : "test.shop",
  27. "name" : "spc.area_1"
  28. }
  29. ]
  30. >

三.  唯一索引

  1. > show tables;
  2. shop
  3. stu
  4. system.indexes
  5. >
  6. >
  7. > db.tea.insert({email:'a@163.com'})
  8. > db.tea.insert({email:'b@163.com'})
  9. >
  10. > db.tea.getIndexes();
  11. [
  12. {
  13. "v" : ,
  14. "key" : {
  15. "_id" :
  16. },
  17. "ns" : "test.tea",
  18. "name" : "_id_"
  19. }
  20. ]
  21. >
  22. >
  23. >
  24. > db.tea.ensureIndex({email:},{unique:true});
  25. >
  26. >
  27. > db.tea.insert({email:'c@163.com'})
  28. > db.tea.insert({email:'c@163.com'})
  29. E11000 duplicate key error index: test.tea.$email_1 dup key: { : "c@163.com" }
  30. >

四. 稀疏索引

稀疏索引的特点------如果针对field做索引,针对不含field列的文档,将不建立索引.
与之相对,普通索引,会把该文档的field列的值认为NULL,并建索引.
适宜于: 小部分文档含有某列时.

db.collection.ensureIndex({field:1/-1},{sparse:true})

  1. -- 模拟数据
  2. > db.tea.insert({});
  3. > db.tea.find();
  4. { "_id" : ObjectId("5743d98aaddef29711337fb4"), "email" : "a@163.com" }
  5. { "_id" : ObjectId("5743d98daddef29711337fb5"), "email" : "b@163.com" }
  6. { "_id" : ObjectId("5743d9cfaddef29711337fb7"), "email" : "c@163.com" }
  7. { "_id" : ObjectId("5743dc98addef29711337fbc") }
  8.  
  9. --稀疏索引下查不到数据
  10. > db.tea.ensureIndex({email:},{sparse:true});
  11. > db.tea.find({email:null});
  12. >
  13.  
  14. > db.tea.dropIndexes();
  15. {
  16. "nIndexesWas" : ,
  17. "msg" : "non-_id indexes dropped for collection",
  18. "ok" :
  19. }
  20.  
  21. --普通索引能查到
  22. > db.tea.ensureIndex({email:});
  23. > db.tea.find({email:null});
  24. { "_id" : ObjectId("5743dc98addef29711337fbc") }

总结:
如果分别加普通索引,和稀疏索引,
对于最后一行的email分别当成null 和 忽略最后一行来处理.
根据{email:null}来查询,前者能查到,而稀疏索引查不到最后一行.

五. 创建哈希索引(2.4新增的)

哈希索引速度比普通索引快,但是,无能对范围查询进行优化.
适宜于---随机性强的散列

db.collection.ensureIndex({file:'hashed'});

  1. > db.tea.ensureIndex({email:'hashed'});
  2. > db.tea.find({email:'a@163.com'}).explain();
  3. {
  4. "cursor" : "BtreeCursor email_hashed",
  5. "isMultiKey" : false,
  6. "n" : ,
  7. "nscannedObjects" : ,
  8. "nscanned" : ,
  9. "nscannedObjectsAllPlans" : ,
  10. "nscannedAllPlans" : ,
  11. "scanAndOrder" : false,
  12. "indexOnly" : false,
  13. "nYields" : ,
  14. "nChunkSkips" : ,
  15. "millis" : ,
  16. "indexBounds" : {
  17. "email" : [
  18. [
  19. NumberLong(""),
  20. NumberLong("")
  21. ]
  22. ]
  23. },
  24. "server" : "localhost.localdomain:27017"
  25. }
  26. >

六. 重建索引

一个表经过很多次修改后,导致表的文件产生空洞,索引文件也如此.
可以通过索引的重建,减少索引文件碎片,并提高索引的效率.
类似mysql中的optimize table

db.collection.reIndex()

  1. > db.tea.reIndex();
  2. {
  3. "nIndexesWas" : ,
  4. "msg" : "indexes dropped for collection",
  5. "nIndexes" : ,
  6. "indexes" : [
  7. {
  8. "key" : {
  9. "_id" :
  10. },
  11. "ns" : "test.tea",
  12. "name" : "_id_"
  13. },
  14. {
  15. "key" : {
  16. "email" : "hashed"
  17. },
  18. "ns" : "test.tea",
  19. "name" : "email_hashed"
  20. }
  21. ],
  22. "ok" :
  23. }

MongoDB基础之六 索引的更多相关文章

  1. MongoDB学习笔记(索引)

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

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

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

  3. MongoDB基础教程系列--未完待续

    最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...

  4. MongoDB 基础(2019年开篇)

    MongoDB基础知识: 1.什么是MongoDB NoSQL(NoSQL=Not Only SQL),意即"不仅仅是SQL". MongoDB是一个介于关系数据库和非关系数据库之 ...

  5. MongoDB基础学习

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  6. windows下mongodb基础玩法系列二CURD附加一

    windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...

  7. MongoDB基础教程系列--目录结构

    最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...

  8. Mongodb 基础 查询表达式

    数据库操作 查看:show dbs; 创建:use dbname; // db.createCollection('collection_name');    隐式创建,需要创建的数据库中有表才表示创 ...

  9. Mongodb 笔记01 MongoDB 简介、MongoDB基础知识、启动和停止MongoDB

    MongoDB 简介 1. 易于使用:没有固定的模式,根据需要添加和删除字段更加容易 2. 易于扩展:MongoDB的设计采用横向扩展.面向文档的数据模型使它能很容易的再多台服务器之间进行分割.自动处 ...

随机推荐

  1. MAC平台下mysql7.5的安装

    1.下载mysql(DMG格式64位的版本) http://dev.mysql.com/downloads/mysql/ 2.安装mysql 待下载*.dmg文件后双击,运行该安装文件 3.无限下一步 ...

  2. hadoop+海量数据面试题汇总(一)

    hadoop面试题 Q1. Name the most common InputFormats defined in Hadoop? Which one is default ? Following  ...

  3. 推荐一款非常好用的java反编译工具(转)

    源: 推荐一款非常好用的java反编译工具

  4. iOS开发中涉及的字体问题

    iOS中常见3种方法来控制字体,下面根据我在网上学习总结的内容发布(已完美避过所有坑,iOS8.4) 一.系统默认的设置字体方法(只对英文和数字生效的方法) 1.系统默认提供的字体主要是指UIFont ...

  5. 苹果应用商店AppStore审核中文指南 分类: ios相关 app相关 2015-07-27 15:33 84人阅读 评论(0) 收藏

    目录 1. 条款与条件 2. 功能 3. 元数据.评级与排名 4. 位置 5. 推送通知 6. 游戏中心 7. 广告 8. 商标与商业外观 9. 媒体内容 10. 用户界面 11. 购买与货币 12. ...

  6. C++中string中的erase函数怎么使用

    erase函数的原型如下:(1)string& erase ( size_t pos = 0, size_t n = npos );(2)iterator erase ( iterator p ...

  7. node.js 下依赖Express 实现post 4种方式提交参数

    上面这个图好有意思啊,哈哈, v8威武啊.... 在2014年的最后一天和大家分享关于node.js 如何提交4种格式的post数据. 上上一篇说到了关于http协议里定义的4种常见数据的post方法 ...

  8. HttpListener 实现web服务端

    1. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syste ...

  9. 在ubuntu中为navicat创建快捷方式

    在ubuntu中,解压navicat并不会生成快捷方式,每次运行都需要进入软件解压的目录,然后运行命令开启navicat,十分不便.今天尝试引入快捷方式,直接双击运行,感觉挺不错. 首先下载一个合适的 ...

  10. Grunt构建工具插件篇——之less工具2

    Grunt任务分为两部分,一部分是任务,即Grunt要执行的代码,找到对应功能的插件就成.所以等会要下载grunt-contrib- less包,这个插件便是把less文件编译成能直接使用的css.另 ...