目录
一、MongoDB索引限制
1、额外开销
2、内存使用
3、查询限制
4、最大范围
二、MongoDB索引
1、ensureIndex()方法
三、MongoDB高级索引
1、索引数组字段
2、索引子文档字段
一、MongoDB索引限制
1、额外开销
每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作。所以,如果你很少对集合进行读取操作,建议不使用索引。
2、内存使用
由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。
如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降。
3、查询限制
索引不能被以下的查询使用:
正则表达式及非操作符,如$nin,$not等。
算术运算符,如$mod,等
$where子句
所以,检测你的语句是否使用索引是一个好的习惯,可以用explain来查看。
从2.6开始,如果现有的索引字段的值超过索引建的限制,MongoDB中不会创建索引。
如果文档的索引字段值超过了索引建的限制,MongoDB不会将任何文档转换成索引的集合。
4、最大范围
集合中索引不能超过64个
索引名的长度不能超过125个字符
一个复合索引最多可以有31个字段
二、MongoDB索引
1、ensureIndex()方法
语法格式:
>db.COLLECTION_NAME.ensureIndex({KEY:1})
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
实例:
>db.col.ensureIndex({"title":1}) >
ensureIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。
>db.col.ensureIndex({"title":1,"description":-1}) >
ensureIndex() 接收可选参数,可选参数列表如下:
Parameter | Type | Description |
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。 |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
dropDups | Boolean | 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
在后台创建索引:
db.values.ensureIndex({open: 1, close: 1}, {background: true})
三、MongoDB高级索引
下面将会用到此文档举例:
{
"address": {
"city": "Los Angeles",
"state": "California",
"pincode": "123"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "Tom Benzamin"
}
文档包含了 address 子文档和 tags 数组。
1、索引数组字段
假如我们基于标签来检索用户,那么我们需要对数组tags建立索引,在数组中创建索引,需要对数组中每个字段依次建立索引,所以我们将会对music、cricket、blogs三个值建立单独的索引。
使用命令:
>db.users.ensureIndex({"tags":1})
创建索引后,我们可以这样检索集合的 tags 字段
>db.users.find({tags:"cricket"})
为了验证我们使用使用了索引,可以使用 explain 命令:
>db.users.find({tags:"cricket"}).explain()
以上命令执行结果中会显示 "cursor" : "BtreeCursor tags_1" ,则表示已经使用了索引。
2、索引子文档字段
假设我们需要通过city、state、pincode字段来检索文档,由于这些字段是子文档的字段,所以我们需要对子文档建立索引。
为子文档的三个字段创建索引,命令如下:
>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
一旦创建索引,我们可以使用子文档的字段来检索数据:
>db.users.find({"address.city":"Los Angeles"})
记住查询表达式必须遵循指定的索引的顺序。所以上面创建的索引将支持以下查询:
>db.users.find({"address.city":"Los Angeles","address.state":"California"})
同样支持以下查询:
>db.users.find({"address.city":"LosAngeles","address.state":"California","address.pincode":"123"})