对于索引,如果查询的时候没有增加索引,读取数据的时候会通过扫描集合中的所有数据,对应的数据量进行查询会效率特别低,如果增加了索引(类似mysql通过最左前缀以及索引顺序),查询起来会相对查询整个文件要快得多
对于mongo的索引有增删改查
创建索引一般通过db.collection.createIndex(参数)(这个为3.0以上使用),如果3.0以下使用,将其createIndex替换为ensureIndex即可
对于带什么参数可看以下内容:
| 参数 | 描述 |
|---|---|
| v | 索引版本号(不设置默认mongo版本号,也可都设置某个数好区分) |
| name | 索引名(string类),无配置通过索引字段名生成(索引顺序) |
| unique | 唯一索引(设置为true),默认为false |
| weights | 该索引相对其他索引权重【1-99999】 |
| sparse | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
| background | 建立该索引过程是否会阻塞其他数据库操作,设置为true(不会阻塞),默认为false |
| expireAfterSeconds | TTL(集合的生存时间,秒为单位) |
创建索引的时候,在索引后面设置value:1 为升序,-1为降序
对于索引可以分为:
唯一索引(索引具备唯一性,保证数据不会重复出现)
普通索引
复合索引(多个字段的匹配查询)
db.sdk_log.createIndex({"id":1},{"unique" : true})db.sdk_log.createIndex({"id":1})db.sdk_log.createIndex({"id":1,"name":1},{background:true})成功显示之后会有(类似如下内容,关键字段已使用xxx替代):
{
"raw" : {
"xxx" : {
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 4,
"numIndexesAfter" : 5,
"ok" : 1,
"$gleStats" : {
"lastOpTime" : {
"ts" : xx,
"t" : xx
},
"electionId" : ObjectId("xx")
}
}
},
"ok" : 1
}
通过对应的explain可看到查询过程,具体如下:db.audio_sdk_log.find({"id":10001}).explain()
通过explain查询是否使用到了索引以及还是全表查询等
关于这部分细节,可参考mysql的:
mongo数据库类似mysql,可看我之前的文章:
查询索引可以通过查询key、详细信息、具体的size
| 参数 | 描述 |
|---|---|
| db.collection.getIndexes() | 查询该集合的所有索引 |
| db.collection.getIndexKeys() | 查询集合中的所有索引键 |
| db.collection.totalIndexSize() | 查询集合索引总大小 |
| db.collection.getIndexSpecs() | 查询集中各索引详细信息,这个查出来跟db.collection.getIndexes()差不多 |
实战中的显示具体如下,通过db.collection.totalIndexSize()查询结果如下:

唯一索引只有一个,查询显示的时候会把所有索引都显示出来
通过db.collection.getIndexes()以及db.collection.getIndexSpecs()大致信息如下:
[
{
"v" : 1,
"key" : {
"id" : 1
},
"name" : "id_",
"ns" : "xxxx.audio_sdk_log"
},
{
"v" : 1,
"unique" : true,
"key" : {
"id" : 1,
"name" : 1
},
"name" : "id_1_name_1",
"ns" : "xxxx.audio_sdk_log"
},
....
]
通过db.collection.getIndexKeys()查询结果如下:
[
{
"id" : 1
},
....
]
修改索引类似重建索引,原本通过创建id为正序的索引:db.collection.createIndex({“id”:1})
将其修改为倒序索引:db.collection.reIndex({"id":-1})
索引的删除根据 【创建索引的name(如果不配置系统会给你设置)】进行删除
使用的代码具体如下:
| 参数 | 描述 |
|---|---|
| db.collection.dropIndex(“索引name”) | 删除该集合的特定索引 |
| db.collection.dropIndex() | 删除该集合内所有索引 |
删除特定的索引,执行成功会返回ok为1的字段(类似如下内容,关键字段已使用xxx替代):
{
"raw" : {
"xxxx" : {
"nIndexesWas" : 9,
"ok" : 1
}
},
"ok" : 1
}