MongoDB基础之六 索引
一 . 索引概述和基本操作
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基础之六 索引的更多相关文章
- MongoDB学习笔记(索引)
		一.索引基础: MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令: > db.test.ensureIndex({" ... 
- MongoDB学习笔记(索引)(转)
		一.索引基础: MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令: > db.test.ensureIndex({" ... 
- MongoDB基础教程系列--未完待续
		最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ... 
- MongoDB 基础(2019年开篇)
		MongoDB基础知识: 1.什么是MongoDB NoSQL(NoSQL=Not Only SQL),意即"不仅仅是SQL". MongoDB是一个介于关系数据库和非关系数据库之 ... 
- MongoDB基础学习
		*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ... 
- windows下mongodb基础玩法系列二CURD附加一
		windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ... 
- MongoDB基础教程系列--目录结构
		最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ... 
- Mongodb 基础 查询表达式
		数据库操作 查看:show dbs; 创建:use dbname; // db.createCollection('collection_name'); 隐式创建,需要创建的数据库中有表才表示创 ... 
- Mongodb 笔记01 MongoDB 简介、MongoDB基础知识、启动和停止MongoDB
		MongoDB 简介 1. 易于使用:没有固定的模式,根据需要添加和删除字段更加容易 2. 易于扩展:MongoDB的设计采用横向扩展.面向文档的数据模型使它能很容易的再多台服务器之间进行分割.自动处 ... 
随机推荐
- JavaScript------for-in的使用方法
			1.在数组中使用 var str = ["a", "b", "c"]; for (var item in str) { //alert(it ... 
- python redis list操作
			LPUSH list_name value [value ...] Prepend one or multiple values to a list 从左侧插入值,最早插入的值在最右边 LPUSHX ... 
- Android之事件分发
			网上总结的很详细了,有时间总结下做个笔记 
- hdu 2614
			#include<stdio.h> int map[99][99]; int vist[99]; int sum=1; int maxsum=1; int max=0; int N; vo ... 
- Qt编译Oracle OCI驱动
			最近使用qt开发了一个访问数据库的工具, 默认使用ODBC驱动注入的方式,后来发现Oracle中ODBC驱动注入经常失败. 后来就想直接使用OCI方式访问,而默认情况下Qt只有Sqlite和ODBC驱 ... 
- bzoj4008: [HNOI2015]亚瑟王【期望dp】
			一个特别神奇的dp,特别厉害. f(i, j) 表示 有 j 轮发动技能的牌在 [1, i] 另外的m - j轮在[i + 1, n]之间的概率. 怎么转移呢? 首先考虑i这张牌不选的情况,f(i - ... 
- Servlet中的过滤器Filter用法
			1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Http ... 
- Spring MVC之Action输入参数
			第一部分:Action输入参数Spring MVC 通过@RequestMapping注解映射请求,最终的真正执行代码为处理器方法,即@RequestMapping注解的方法.Spring MVC方法 ... 
- builds error
			使用cocoapods 出现Undefined symbols for architecture i386: _OBJC_CLASS_$_XXXXXXX", referenced from: ... 
- iOS 框架 Nimbus
			Nimbus好像是用来处理 视图控制器的 解耦 参考: http://www.oschina.net/p/nimbuskit 
