项目场景:Mongo在首次查询特慢,后面就好的。如果长时间不查询,下次开始的第一次又将非常慢,于是从链接当时多方面,排查最终发现还是mongo索引建的有问题。
MongoDB在大批量数据查询时经常会遇到查询耗时长,通常情况采用建各种索引来优化。
首先第一步排查,可以在查询后使用.explain()来查看查询数据轨迹,便于分析每个分片的查询索引。
db.Collection.find({}).explain()
查看索引,如果不位可以根据查询条件,新建索引。
1.查询索引
db.COLLECTION_NAME.getIndexes()
2.新建索引
db.COLLECTION_NAME.ensureIndex(keys[options])
此命令支持分片创建索引
keys
,要建立索引的参数列表。如:{KEY:1}
,其中key
表示字段名,1
表示升序排序,也可使用使用数字-1
降序。options
,可选参数,表示建立索引的设置。可选值如下:background
,Boolean,在后台建立索引,以便建立索引时不阻止其他数据库活动。默认值 false。unique
,Boolean,创建唯一索引。默认值 false。name
,String,指定索引的名称。如果未指定,MongoDB会生成一个索引字段的名称和排序顺序串联。dropDups
,Boolean,创建唯一索引时,如果出现重复删除后续出现的相同索引,只保留第一个。sparse
,Boolean,对文档中不存在的字段数据不启用索引。默认值是 false。v
,index version,索引的版本号。weights
,document,索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
3.重新创建索引
如果发现索引不合适就重新创建
db.COLLECTION_NAME.reIndex()
4.删除索引
db.COLLECTION_NAME.dropIndex("INDEX-NAME")