关于mongodb索引优化的实现与思考

来源:互联网 发布:足球 知乎 编辑:程序博客网 时间:2024/05/22 17:19

一千万条数据,查询频率最高的查询语句如下

db.comment.find({'accountId':48,'rootId':3745809,'type':140,'status':12}).limit(1).explain()
db.comment.find({'rootId':707629,'type':40,'status':0}).sort({'commentId':-1}).limit(1).explain()
db.comment.find({'accountId':49,'rootId':495802,'type':140,'status':11}).limit(20).explain()
db.comment.find({'rootId':995691,'status':0,'commentId':{$lt:10269000}}).sort({'commentId':-1}).limit(20).explain()
db.comment.find({'rootId':995691,'type':10,'status':{$lt:10}}).sort({'commentId':-1}).explain()
db.comment.find({'accountId':717252,'currBoardId':4666235,'status':11,'createTime':{$lt:'2013-09-09 08:38:00',$gt:'2013-09-09 08:38:50'}}).limit(1).explain()

现要对以上语句建立索引,而且不能太多,不然插入数据时会很慢。

我的思路:

一,找出这些语句中80%以上会出现的字段,分别为rootId,accountId,type,status,commentId

二,分析这些字段所在的查询语句的共同与不同之处,分析后发现,这些语句可以分为两类,即以accountId开头的和以rootId开头的,于是,索引就出来了:

{ "accountId" : 1, "status" : 1, "rootId" : -1, "type" : 1 }
{ "status" : 1, "rootId" : -1, "commentId" : -1, "type" : 1 }

在建索引时,并不是要给查询语句中的没一个字段都能是有意义的索引,如果某个字段没有建索引,但是所在的查询语句中的其它字段建了组合索引,那就不需要在建这个索引了,除非其它字段的组合索引的威力没有这一个字段的索引大时才考虑再加上。

顺便说一下,如果你的查询语句是这几个字段,那么索引字段的顺序在Mongodb的2.0后就没有区别了。

原创粉丝点击