MongoDB 索引篇

索引的简介

索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度。且添加索引之后的对文档的删除,修改会比以前速度慢。因为在进行修改的时候会对索引进行更新。

创建一个简单的索引

db.wsc.ensureIndex({"username":1})

这样在查找的时候速度回变快

db.wsc.find({usernmae:"jack ma"})

mongodb限制每个集合最多有64个索引。通常,在一个特定的集合上,不应该拥有两个以上的索引。

.

**复合索引**
建立了一个复合索引(建立在多个字段上的索引),如果查询条件包括多个键,这个索引就非常有用

db.users.ensureIndex({'age':1, 'username': 1})

查询方式

点查询 point query

用于查询单个值(尽管包含这个值的文档可能有多个)

db.users.find({'age': 21})

可能21岁的人很多,所以这个查询会有很多的结果的返回。



多值查询 multi-value-query

查找多个值相匹配的文档。多值查询也可以理解为多个点查询。

db.users.find({'age': {"$gte": 21, "$lte": 30}})

###**索引的类型**
***单键索引***
就是最普通的的索引

db.users.ensureIndex({'username': 1})

**唯一索引**
确定集合的每一个文档的指定键都是唯一的值

db.users.ensureIndex({'username': 1, unique: true})

这样创建了一个值,以后再插入数据的时候,username键的值不能重复,否则会插入不成功



多键索引

如果某个键在文档中被标记为数组,那么这个索引就会被标记为多键索引

> db.members.find()
{ "_id" : ObjectId("1"), "tags" : [ "ame", "fear", "big" ] }
{ "_id" : ObjectId("2"), "tags" : [ "ame", "fear", "big", "chi" ] }
{ "_id" : ObjectId("3"), "tags" : [ "ame", "jr", "big", "chi" ] }

当我查找tags='jr'数据时,db会查找所有文档,所以nscanned=3,并且返回一条,此时n=1。

>db.members.find({tags: 'jr'}).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 1,
"nscanned" : 3,
}

然后建立索引

 db.members.ensureIndex({tags:1})

之后我们在对tags='jr'进行查找,此时nscanned=1,并且isMultiKey由原来的false变为true。所以可以说明,mongodb对数组做了多个键的索引,即把所有的数组元素都做了索引。

> db.members.find({tags: 'jr'}).explain()
{
"cursor" : "BtreeCursor tags_1",
"isMultiKey" : true,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
}

**过期索引**
顾名思义就是索引过期之后,相应的数据会被删除。比较适合一些存储一段时间的数据。
*和设置单键索引很类似,只是多个expireAfterSeconds参数,单位是秒。*

db.collectionName.ensureIndex({key: 1}, {expireAfterSeconds: 10})

例子 下面建立一个索引,然后数据会在30秒后删除

db.members.ensureIndex({time:1}, {expireAfterSeconds: 30})

被索引键的值必须是ISODate时间类型,例如new Date()类型。如果是非时间类型,则不会自动删除

稀疏索引

使用sparse可以创建稀疏索引和唯一索引

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

创建了稀疏索引的字段,在插入数据的时候无论是否这个字段是否存在都可以插入成功。

哈希索引

db.collection.createIndex( { _id: "hashed" } )

地理位置索引

当文档中有这样的数据时

	db.places.insert(
{
loc : { type: "Point", coordinates: [ -73.97, 40.77 ] },
name: "Central Park",
category : "Parks"
}
) db.places.insert(
{
loc : { type: "Point", coordinates: [ -73.88, 40.78 ] },
name: "La Guardia Airport",
category : "Airport"
}
)

可以创建地理索引

db.places.createIndex( { loc : "2dsphere" } )

**文本索引 **

###索引管理
system.indexes集合中包含了每个索引的详细信息

db.system.indexes.find()

**1 创建索引**
在**mongo shell**中国有两个方法

	ensureIndex()
createIndex()

例子

db.users.ensureIndex({'username': 1})

2 getIndexes()查看索引

db.collectionName.getIndexes()

——————————————————

db.users.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test.users",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"username" : 1
},
"ns" : "test.users",
"name" : "username_1"
}
]

3.dropIndex删除索引

> db.users.dropIndex("username_1"){ "nIndexesWas" : 2, "ok" : 1 }

 db.users.dropIndex({"username":1})

MongoDB 索引篇的更多相关文章

  1. MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划

    这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...

  2. MongoDB(索引及C#如何操作MongoDB)(转载)

    MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureInd ...

  3. 【mongoDB高级篇③】综合实战(1): 分析国家地震数据

    数据准备 下载国家地震数据 http://data.earthquake.cn/data/ 通过navicat导入到数据库,方便和mysql语句做对比 shard分片集群配置 # step 1 mkd ...

  4. mongodb 索引分类

    一. 普通索引篇 1.创建索引 创建索引:db.person.ensureIndex({"age":1}).这里我们使用了ensureIndex在age上建立了索引.“1”:表示按 ...

  5. mongodb入门篇

    MongoDB 入门篇 分类: NoSQL, 故障解决 undefined 1.1 数据库管理系统 在了解MongoDB之前需要先了解先数据库管理系统 1.1.1 什么是数据? 数据(英语:data) ...

  6. [DataBase] MongoDB (7) MongoDB 索引

    MongoDB 索引 1. 建立索引 唯一索引db.passport.ensureIndex( {"loginname": 1}, {"unique": tru ...

  7. SQL Server数据库性能优化之索引篇【转】

    http://www.blogjava.net/allen-zhe/archive/2010/07/23/326966.html 性能优化之索引篇 近期项目需要, 做了一段时间的SQL Server性 ...

  8. MongoDB索引介绍

    MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...

  9. MongoDB索引(一)

    原文地址 一.介绍 我们已经很清楚索引会提高查询效率.如果没有索引,MongoDB必须对全部集合进行扫描,即,扫描集合中每条文档以选择那些符合查询条件的文档.对查询来说如果存在合适的索引,则Mongo ...

随机推荐

  1. Fedora下phpMyAdmin的安装和配置

    phpMyAdmin主要用于以web界面形式管理mysql.其在Fedora下的安装方法如下: 1. yum install phpMyAdmin 利用yum安装的phpMyAdmin,其路径如下: ...

  2. 【Ubuntu16】apt-get安装MariaDB

    一.Mysql背景信息 Mysql在互联网早期就流行了,追求速度.简单.坚持开源.几乎支持所有操作系统.完全支持多用户.多线程,支持海量数据存储,采用MyISAM.InnoDB两大存储引擎优势互补.但 ...

  3. 【Linux】Apache Httpd 服务管理

    基本的操作方法: 本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况 apahce启动命令: 推荐 [user@master1 ~]$  /usr/local ...

  4. CentOS7下搭建hadoop2.7.3完全分布式

    这里搭建的是3个节点的完全分布式,即1个nameNode,2个dataNode,分别如下: CentOS-master   nameNode   192.168.11.128 CentOS-node1 ...

  5. WeQuant交易策略—KDJ

    KDJ随机指标策略策略介绍KDJ指标又叫随机指标,是一种相当新颖.实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具.随机指标KDJ ...

  6. Java利用自定义注解、反射实现简单BaseDao

    在常见的ORM框架中,大都提供了使用注解方式来实现entity与数据库的映射,这里简单地使用自定义注解与反射来生成可执行的sql语句. 这是整体的目录结构,本来是为复习注解建立的项目^.^ 好的,首先 ...

  7. 浅酌iOS 11兼容性

    WeTest导读 苹果在WWDC2017大会,公布了最新的iOS 11,系统新特性肯定是让不少果粉充满期待.在网上已能看到不少关于iOS 11的体验文章,那么iOS 11的新特性会对APP产生什么兼容 ...

  8. 6.26学习 异步委托回调函数 VS 多线程 VS 并行处理

    描述: 我现在是轮询着构建实例,然后这个实例去执行一个方法,但是执行方法需要大约10s时间,全部轮询下来需要很长时间.所以我现在要更改,头给了我两个方法,1多线程 2异步委托回调函数. 异步委托回调函 ...

  9. 【JSP】JSP Action动作标签

    Action动作标签简述 JSP action是JSP技术体系内置的一组标签,使用无需导入,或者添加另外的库.JSP action标签都是对Java代码的逻辑的封装.主要使用的是下面这些. 标签 作用 ...

  10. JS函数参数

    1.js不是面向对象,不可以重载函数.如果两个函数方法名相同,参数不同,那么js加载时后面的函数会覆盖前面的函数. 所以调用函数时只会调用后面的方法. 2.js设置可变参数时,可以用arguments ...