首页 > 数据库 > MongoDB > 正文

十天掌握MongoDB之四:使用索引

2020-03-14 13:23:21
字体:
来源:转载
供稿:网友

创建索引

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实例

十天掌握MongoDB之四:使用索引

小结

1、索引可以加速查询;

2、单个索引无需在意其索引方向;

3、多键索引需要慎重考虑每个索引的方向;

4、做海量数据更新时应当先卸载所有索引,待数据更新完成后再重建索引;

5、不要试图为每个键都创建索引,应考虑实际需要,并不是索引越多越好;

6、唯一索引可以用来消除重复记录;

7、地理空间索引是没有单位的,其内部实现是基本的勾股定理算法。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表