创建索引
MongoDB的索引机制与传统的关系型数据库索引几乎是一样的,绝大多数优化SQL索引的技巧也都适用于MongoDB。索引会增加数据插入、更新和删除的性能开销,应避免为每个键都创建索引。
// 创建 索引
db . things . ensureIndex ({
'j ' : 1
});
// 创建子文档 索引
db . things . ensureIndex ({
'user.Name ' : - 1
});
// 创建复合索引
db . things . ensureIndex ({
'j ' : 1 , // 升序
'x ' : - 1 // 降序
});
/*
如果您的 find 操作只用到了一个键,那么索引方向是无关紧要的;当创建复合索引的时候,一定要谨慎斟酌每个键的排序方向 。
* /
修改索引
// 修改索引,只需要重新运行索引命令即可
// 如果索引已经存在则会重建, 不存在的索引会被 添加
db . things . ensureIndex ({
// 原来的索引会 重建
'user.Name ' : - 1 ,
// 新增一个升序 索引
'user.Name ' : 1 ,
// 为 Age 新建降序 索引
'user.Age ' : - 1
}, {
// 打开后台执行
‘background' : true
});
// 重建索引
db. things .reIndex();
注意:MongoDB不会检查要索引的键名是否真的存在。当background为false或未指定时,创建索引的过程会以阻塞的形式运行,此时MongoDB无法处理任何请求。
删除索引
如果删除整个集合(drop)也会删除集合中的索引。如果是删除集合中所有的文档(remove)则不会影响索引,当有新文档插入时,索引就会重建。
// 删除集合中的所有 索引
db . things . dropIndexes ();
// 删除指定键的索引
db . things . dropIndex ({
x : 1 ,
y : - 1
});
// 使用 command 删除指定键的 索引
db . runCommand ({
dropIndexes : 'foo ' ,
index : { y : 1 }
});
// 使用 command 删除所有 索引
db . runCommand ({
dropIndexes : 'foo ' ,
index : '*‘
});
唯一索引
// 创建唯一索引,同时这也是一个符合唯一索引
db . things . ensureIndex (
{
'firstName ' : 1 ,
'lastName ' : 1
}, {
// 指定为唯一索引
'unique ' : true ,
// 删除重复 记录
'dropDups ' : true
});
注意:
1、_id本身就是个唯一索引,不同的是,它不能被删除;
2、删除重复记录时,仅会按顺序保留第一文档;
3、如果创建了唯一索引,但文档并不包含该键,默认以null存储,因此如果发现了第二项未指定该键或该键被指定为null的记录,就会被认为是重复的;
4、所谓复合唯一索引,允许单键重复,但组合起来之后是不允许重复的;
地理空间索引 - 创建
不了解神马是地理空间?先看下百度的解释吧【地理空间】!
MongoDB为处理地理空间信息增加了一个专门的索引结构——2d,对就是二弟!
要使用二弟索引,表示地理坐标的键必须是一个长度为2的数组。然后为该键创建取值为“2d”的索引即可。请看下面代码实例。
// 文档 格式
{
'_ id' : 1 ,
'name ' : ' 天安门 ' ,
'location' :[
116.12345 ,
39.54321
]
}
// 创建地理空间 索引
db . map . ensureIndex ({
'location ' : '2d‘
});
MongoDB的地理空间索引的取值没有单位,这意味着你可以为其设置任何单位。默认地理空间索引的假设值是-180 ~ 180。如果需要自定义其他的取值范围,请参考下面代码实例。
// 创建地理空间 索引
db . map . ensureIndex ({
'location ' : '2d‘
}, {
'min ' : - 10000 ,
'max ' : 10000
});
地理空间索引 - $NEAR
$near操作符与geoNear Command的区别在于:geoNear会同时返回每个地标与给定中心点的距离(注意,这里的距离没有单位)。
// $near 操作符
db . places . find ({
loc : {
// 中心点
$ near : [ 50 , 50 ],
// 查询半径
$ maxDistance : 5
}
}). limit ( 20 );
// 如果没有指定 limit ,其默认值为 100
地理空间索引 - $WITHIN(BOX)
$within操作符支持以下几个选项:
• $box:矩形查找
• $center:圆形查找
• $polygon:多边形查找(v1.9+支持)
$box实例
// 定义一个矩形 区域
var box = [
// 左 上角
[ 40.73083 , - 73.99756 ],
// 右 下角
[ 40.741404 , - 73.988135 ]
];
// 查找
db . places . find ({
" loc" : {
"$ within" : {
"$ box" : box
}
}
});
$center实例
// 定义 中心点
var center = [ 50 , 50 ];
// 定义查找 半径
var radius = 10 ;
// 查找
db . places . find ({
" loc" : {
"$ within" : {
// 注意这里是数组传递
"$ center" : [
center ,
radius
]
}
}
});
$polygon实例
小结
1、索引可以加速查询;
2、单个索引无需在意其索引方向;
3、多键索引需要慎重考虑每个索引的方向;
4、做海量数据更新时应当先卸载所有索引,待数据更新完成后再重建索引;
5、不要试图为每个键都创建索引,应考虑实际需要,并不是索引越多越好;
6、唯一索引可以用来消除重复记录;
7、地理空间索引是没有单位的,其内部实现是基本的勾股定理算法。
新闻热点
疑难解答