DDS里索引的使用
索引的使用在MongoDB里至关重要,一个索引的缺失,可能导致一个MongoDB的操作时长增加成百上千倍。下面我们就来讲讲如何在MongoDB里使用索引。
对集合的写操作同时会操作集合上的索引,从而触发更多的IO操作,所以在写操作较多的集合上创建索引要慎重。
DDS会加载索引到内存,无用索引加载到内存会浪费内存空间,所以不要创建不会被使用到的索引,因业务逻辑变化而产生的无用索引也要及时清理。
db.collection.aggregate([{$indexStats:{}}])
{
"name" : "test",
"key" : {
"key" : 1
},
"host" : "xxx:27017",
"accesses" : {
"ops" : NumberLong(0),
"since" : ISODate("2018-10-15T16:21:36.285Z")
}
}
不要创建庞大的索引。建议在多个字段中存储数值的集合,而不是在一个字段存储大量数值。这样的索引设计使得更新操作更高效。
不要基于复合索引的靠前字段再创建索引。复合索引可以被用于一个索引中主要字段的查询。例如,一个基于firstname和lastname的复合索引可以用于在fistname上的查询,这样,基于firstname的索引是不必要的。
在生产环境创建索引,采用后台模式创建以避免影响当前业务。
db.test.createIndex( { zipcode: 1 }, { background: true } )
查询场景比较多时,尽量在查询条件、排序条件的key 上创建组合索引,可以显著提高查询效率。
在$ne和$nin条件的字段上,一般不建议创建索引。$ne和$nin往往需要走全表扫描。在这种情况下,建议针对创建索引和不创建索引两种场景进行验证,如果不创建索引查询更快,则删除在该字段上已创建的索引。
避免使用$not。MongoDB 并不会对缺失的数据进行索引,因此$not的查询条件将会要求在一个结果集中扫描所有记录。如果$not是唯一的查询条件,会对集合进行全表扫描。
- 点赞
- 收藏
- 关注作者
评论(0)