MongoDB索引使用

MongoDB索引 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构

建立索引

db.collction.ensureIndex({'name':1})
后台创建索引(速度慢些,不阻塞)
db.collction.ensureIndex({'name':1},{"background":true})
复合索引
db.music.ensureIndex({'singer':1,'title':1, 'style':1})
唯一索引
db.collction.ensureIndex({'name':1},{ unique: true } )
上面建立的符合索引可以覆盖以下查询
{'singer':1}
{'singer':1,'title':1}
{'singer':1,'style':1}
{'singer':1,'title':1, 'style':1}
ttl索引
db.collction.ensureIndex({'name':1}, {expireAfterSeconds: 3600})

删除索引

db.collection.dropIndex({'name':1})

使用explain来查看查询信息

不建索引的情况下会进行全表扫描
> db.music.find({'singer':'刘德华','title':'忘情水'}).explain()
{
	"cursor" : "BasicCursor",
	"isMultiKey" : false,
	"n" : 2,
	"nscannedObjects" : 202086,
	"nscanned" : 202086,
	"nscannedObjectsAllPlans" : 202086,
	"nscannedAllPlans" : 202086,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 1578,
	"nChunkSkips" : 0,
	"millis" : 88,
	"server" : "9739e28aec4d:27017",
	"filterSet" : false
}


> db.music.find({'singer':'刘德华','title':'忘情水'}).explain()
{
	"cursor" : "BtreeCursor singer_1_title_1_style_1",
	"isMultiKey" : true,
	"n" : 2,
	"nscannedObjects" : 2,
	"nscanned" : 5,
	"nscannedObjectsAllPlans" : 2,
	"nscannedAllPlans" : 5,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 0,
	"indexBounds" : {
		"singer" : [
			[
				"刘德华",
				"刘德华"
			]
		],
		"title" : [
			[
				"忘情水",
				"忘情水"
			]
		],
		"style" : [
			[
				{
					"$minElement" : 1
				},
				{
					"$maxElement" : 1
				}
			]
		]
	},
	"server" : "9739e28aec4d:27017",
	"filterSet" : false
}
可以看到,建立索引后,可以看到nscanned大幅减少,查询花费的时间也会大幅的减少

修改索引

系统运行一段时间以后,随着数据的累加,业务需求的变化,可能会需要对索引进行重建(rebuild),则可以做这个操作:

db.collection.reIndex()

rebuild会先删除集合上的所有索引,包括_id索引,然后重建。这种操作往往和耗时,最好在系统资源充足的时候做。


reference

[MongoDB索引探索]


wechat
微信扫一扫,订阅我的博客动态^_^