MongoDB 索引篇
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 索引篇的更多相关文章
- MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...
- MongoDB(索引及C#如何操作MongoDB)(转载)
MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureInd ...
- 【mongoDB高级篇③】综合实战(1): 分析国家地震数据
数据准备 下载国家地震数据 http://data.earthquake.cn/data/ 通过navicat导入到数据库,方便和mysql语句做对比 shard分片集群配置 # step 1 mkd ...
- mongodb 索引分类
一. 普通索引篇 1.创建索引 创建索引:db.person.ensureIndex({"age":1}).这里我们使用了ensureIndex在age上建立了索引.“1”:表示按 ...
- mongodb入门篇
MongoDB 入门篇 分类: NoSQL, 故障解决 undefined 1.1 数据库管理系统 在了解MongoDB之前需要先了解先数据库管理系统 1.1.1 什么是数据? 数据(英语:data) ...
- [DataBase] MongoDB (7) MongoDB 索引
MongoDB 索引 1. 建立索引 唯一索引db.passport.ensureIndex( {"loginname": 1}, {"unique": tru ...
- SQL Server数据库性能优化之索引篇【转】
http://www.blogjava.net/allen-zhe/archive/2010/07/23/326966.html 性能优化之索引篇 近期项目需要, 做了一段时间的SQL Server性 ...
- MongoDB索引介绍
MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...
- MongoDB索引(一)
原文地址 一.介绍 我们已经很清楚索引会提高查询效率.如果没有索引,MongoDB必须对全部集合进行扫描,即,扫描集合中每条文档以选择那些符合查询条件的文档.对查询来说如果存在合适的索引,则Mongo ...
随机推荐
- Linux sort命令中文手册(info sort翻译)
说明: (1).本手册只挑选了有用的信息进行翻译,如要查看完完整整的内容,请自行info sort. (2).译文中,在括号中使用了"注"的,为本人所加,非原文内容,助于理解和说明 ...
- 【SVN】手动删除svn元信息
工作中当重建svn仓库,需要把之前的项目导入到新的仓库中,熟悉又快捷的方式是项目上右键->Team断开连接->删除元信息,然后项目右键->Team>Share Project- ...
- 从基于idea的第一个javaweb项目到shell脚本项目自动发布(jdk1.8,mysql5.7,maven3.5,tomcat9,subversion,centos7.3)之一
首先说一下为什么写这篇文章,因为从正式参加工作就做javaweb开发,一路走来,碰到了很多的问题,每次问题都想从度娘那里得到准确的答案,但是,每个人遇到的问题不尽相同,问题的解决方案有时候也只是仅供参 ...
- PHP 字符串替换
这是2017上半年的第一篇学习笔记,也是最后一篇,捂脸- 在前几天的工作中,关于"银行卡"页面原型如下,其中,不同银行卡的卡号只保留了最后四位数字可以显示,其他数字均用*字符隐藏了 ...
- [2017-08-16]ABP系列——QuickStartB:正确理解Abp解决方案的代码组织方式、分层和命名空间
本系列目录:Abp介绍和经验分享-目录 介绍ABP的文章,大多会提到ABP框架吸收了很多最佳实践,比如: 1.N层 (复用一下上篇的图) 展现层(Personball.Demo.Web):asp.ne ...
- php 数据访问练习:租房查询页面
<html> <head> <title></title> <meta charset="UTF-8"/> <li ...
- 『HTMl5』学习日志
w3g提供在线校验页面:http://validator.w3.org/ 1.文本框获取焦点 <%@ page language="java" import="ja ...
- selenium实战学习第一课
#-*- coding:utf-8 -*- __author__ = "carry" from selenium import webdriver from selenium.we ...
- 为Markdown文件生成目录
缘由 思路 效果 代码实现 缘由 Markdown源生文件源生不支持目录,目前比较主流的生成目录的方式(各式插件),都是转化为HTML文件.虽然HTML文件可以生成眼花缭乱的目录,但是修改起来又没有M ...
- spring配置datasource三种方式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp34 spring配置datasource三种方式 1.使用org.spri ...