一 . 索引概述和基本操作

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});

例子:

 > for (var i = ;i<=;i++){
... db.stu.insert({sn:i,name:'student'+i})
... };
>
>
> db.stu.find().count(); > db.stu.find({sn:});
{ "_id" : ObjectId("574271a9addef29711337c28"), "sn" : , "name" : "student99" }
> db.stu.find({sn:}).explain();
{
"cursor" : "BasicCursor", -- 无索引相当于mysql的全表扫描
"isMultiKey" : false,
"n" : ,
"nscannedObjects" : , -- 扫描了1000行
.... > db.stu.ensureIndex({sn:}); --创建索引
> db.stu.find({sn:}).explain();
{
"cursor" : "BtreeCursor sn_1", --使用了索引
"isMultiKey" : false,
"n" : ,
"nscannedObjects" : , --只用扫描一行
...
} > db.stu.getIndexes(); --查询索引
[
{
"v" : ,
"key" : {
"_id" : -- 默认创建 正序
},
"ns" : "test.stu",
"name" : "_id_"
},
{
"v" : ,
"key" : {
"sn" :
},
"ns" : "test.stu",
"name" : "sn_1"
}
] > db.stu.ensureIndex({sn:,name:});
>
>
> db.stu.getIndexes();
[
{
"v" : ,
"key" : {
"_id" :
},
"ns" : "test.stu",
"name" : "_id_"
},
{
"v" : ,
"key" : {
"sn" :
},
"ns" : "test.stu",
"name" : "sn_1"
},
{
"v" : ,
"key" : {
"sn" : ,
"name" :
},
"ns" : "test.stu",
"name" : "sn_1_name_1"
}
]

二. 子文档索引

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

 > db.shop.insert({name:'Nokia',spc:{weight:,area:'taiwan'}});
> db.shop.insert({name:'Nokia',spc:{weight:,area:'korea'}}); > db.shop.find({'spc.area':'taiwan'});
{ "_id" : ObjectId("5743d662addef29711337fb0"), "name" : "Nokia", "spc" : { "weight" : , "area" : "taiwan" } } > db.shop.ensureIndex({'spc.area,1'});
Tue May ::58.823 SyntaxError: Unexpected token }
> db.shop.ensureIndex({'spc.area':});
>
> db.shop.getIndexes();
[
{
"v" : ,
"key" : {
"_id" :
},
"ns" : "test.shop",
"name" : "_id_"
},
{
"v" : ,
"key" : {
"spc.area" :
},
"ns" : "test.shop",
"name" : "spc.area_1"
}
]
>

三.  唯一索引

 > show tables;
shop
stu
system.indexes
>
>
> db.tea.insert({email:'a@163.com'})
> db.tea.insert({email:'b@163.com'})
>
> db.tea.getIndexes();
[
{
"v" : ,
"key" : {
"_id" :
},
"ns" : "test.tea",
"name" : "_id_"
}
]
>
>
>
> db.tea.ensureIndex({email:},{unique:true});
>
>
> db.tea.insert({email:'c@163.com'})
> db.tea.insert({email:'c@163.com'})
E11000 duplicate key error index: test.tea.$email_1 dup key: { : "c@163.com" }
>

四. 稀疏索引

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

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

 -- 模拟数据
> db.tea.insert({});
> db.tea.find();
{ "_id" : ObjectId("5743d98aaddef29711337fb4"), "email" : "a@163.com" }
{ "_id" : ObjectId("5743d98daddef29711337fb5"), "email" : "b@163.com" }
{ "_id" : ObjectId("5743d9cfaddef29711337fb7"), "email" : "c@163.com" }
{ "_id" : ObjectId("5743dc98addef29711337fbc") } --稀疏索引下查不到数据
> db.tea.ensureIndex({email:},{sparse:true});
> db.tea.find({email:null});
> > db.tea.dropIndexes();
{
"nIndexesWas" : ,
"msg" : "non-_id indexes dropped for collection",
"ok" :
} --普通索引能查到
> db.tea.ensureIndex({email:});
> db.tea.find({email:null});
{ "_id" : ObjectId("5743dc98addef29711337fbc") }

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

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

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

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

 > db.tea.ensureIndex({email:'hashed'});
> db.tea.find({email:'a@163.com'}).explain();
{
"cursor" : "BtreeCursor email_hashed",
"isMultiKey" : false,
"n" : ,
"nscannedObjects" : ,
"nscanned" : ,
"nscannedObjectsAllPlans" : ,
"nscannedAllPlans" : ,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : ,
"nChunkSkips" : ,
"millis" : ,
"indexBounds" : {
"email" : [
[
NumberLong(""),
NumberLong("")
]
]
},
"server" : "localhost.localdomain:27017"
}
>

六. 重建索引

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

db.collection.reIndex()

 > db.tea.reIndex();
{
"nIndexesWas" : ,
"msg" : "indexes dropped for collection",
"nIndexes" : ,
"indexes" : [
{
"key" : {
"_id" :
},
"ns" : "test.tea",
"name" : "_id_"
},
{
"key" : {
"email" : "hashed"
},
"ns" : "test.tea",
"name" : "email_hashed"
}
],
"ok" :
}

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. gulp用法

    转载:http://segmentfault.com/blog/laopopo/1190000000372547 http://javascript.ruanyifeng.com/tool/gulp. ...

  2. (简单) HUST 1017 Exact cover , DLX+精确覆盖。

    Description There is an N*M matrix with only 0s and 1s, (1 <= N,M <= 1000). An exact cover is ...

  3. LWIP_STM32_ENC28J60_NETCONN_TCP_SERVICER(5)

    前面说了TCP客户端通讯,这一篇来说说单片机作为服务器的通讯方法 tcp客户端和服务器的链接做大的不同在于服务器是不需要主动链接谁的,他只需要绑定在自己得一个特定的端口之上,等别人来连接就好了,先创建 ...

  4. html中的图片、css、js等路径加载问题

    网页文件的存取路径有3种:物理路径.绝对路径和相对路径. 物理路径就是你的文件放在主机上的具体位置,例如:D:\\image\\1.jpg 这种格式,该方法可以很快确定出你的文件,但是在网页显示路径基 ...

  5. STM32 对内部FLASH读写接口函数(转)

    源:STM32 对内部FLASH读写接口函数 因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. ...

  6. UITableView回调和table相关成员方法详解

    http://blog.csdn.net/kingsley_cxz/article/details/9123959 1.UITableView的datasource实现: //回调获取每个sectio ...

  7. iOS开发系统版本适配(未完待续。。。)

    1.iOS9引入了新特性App Transport Security (ATS).新特性要求App内访问的网络必须使用HTTPS协议:iOS9系统发送的网络请求将统一使用TLS 1.2 SSL.采用T ...

  8. [转] 如何让CloudStack使用KVM创建Windows实例成功识别并挂载数据盘

    在使用kvm给windows虚拟机动态挂载virtio类型的硬盘时候遇到问题,通过下面的文章知道需要安装virtio驱动,从而解决问题使挂在正常,在此处mark一下 问题产生背景: 使用CloudSt ...

  9. nginx的一些配置

    map $http_user_agent $***_build_version { default "***.exe"; "~Windows NT 10.0" ...

  10. [Angular Tutorial] 13 -REST and Custom Services

    在这一步中,我们将会改变我们获取数据的方式. ·我们定义一个代表RESTful客户端的自定义服务.使用这个客户端,我们可以用一种更简单的方法向服务端请求数据,而不用处理更底层的$httpAPI,HTT ...