DDS里索引的使用

举报
小小小小 发表于 2018/11/05 23:02:47 2018/11/05
【摘要】 索引的使用在MongoDB里至关重要,一个索引的缺失,可能导致一个MongoDB的操作时长增加成百上千倍。下面我们就来讲讲如何在MongoDB里使用索引。对集合的写操作同时会操作集合上的索引,从而触发更多的IO操作,所以在写操作较多的集合上创建索引要慎重。 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是唯一的查询条件,会对集合进行全表扫描。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。