美文网首页
MongoDB创建索引

MongoDB创建索引

作者: kobe0429 | 来源:发表于2019-10-28 13:51 被阅读0次

    1、索引语法
    MongoDB使用 createIndex () 方法来创建索引, createIndex()方法基本语法格式如下所示: db.collection.createIndex(keys, options)语法中 Key 值为要创建的索引字段:
    1为指定按升序创建索引,
    如果你想按降序来创建索引指定为-1,
    也可以指定为hashed(哈希索引)。
    语法中options为索引的属性;
    2、创建和删除索引
    3、索引类型
    索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。索引主要用于排序和检索
    1`)单键索引
    在某一个特定的属性上建立索引,例如:db.users. createIndex({age:-1});mongoDB在ID上建立了唯一的单键索引,所以经常会使用id来进行查询;在索引字段上进行精确匹配、排序以及范围查找都会使用此索引;
    2)复合索引
    在多个特定的属性上建立索引,例如:db.users. createIndex({username:1,age:-1,country:1});复合索引键的排序顺序,可以确定该索引是否可以支持排序操作;在索引字段上进行精确匹配、排序以及范围查找都会使用此索引,但与索引的顺序有关;为了内存性能考虑,应删除存在与第一个键相同的单键索引
    3)多键索引
    在数组的属性上建立索引,例如:db.users. createIndex({favorites.city:1});针对这个数组的任意值的查询都会定位到这个文档,既多个索引入口或者键值引用同一个文档

    4、优化查询改进
    1)第一步:找出慢查询
    开启内置的查询分析器,记录读写操作效率:
    db.setProfilingLevel(n,{m}),n的取值可选0,1,2;0是默认值表示不记录;1表示记录慢速操作,如果值为1,m必须赋值单位为ms,用于定义慢速查询时间的阈值;2表示记录所有的读写操作;
    例如:db.setProfilingLevel(1,300)
    2)分析慢查询
    找出慢速查询的原因比较棘手,原因可能有多个:应用程序设计不合理、不正确的数据模型、硬件配置问题,缺少索引等;接下来对于缺少索引的情况进行分析:使用explain分析慢速查询 例如:db.orders.find({'price':{'$lt':2000}}).explain('executionStats') explain的入参可选值为:"queryPlanner" 是默认值,表示仅仅展示执行计划信息;"executionStats" 表示展示执行计划信息同时展示被选中的执行计划的执行情况信息; "allPlansExecution" 表示展示执行计划信息,并展示被选中的执行计划的执行情况信息,还展示备选的执行计划的执行情况信息;
    3)根据问题进行优化
    queryPlanner(执行计划描述) winningPlan(被选中的执行计划) stage(可选项:COLLSCAN 没有走索引;IXSCAN使用了索引) rejectedPlans(候选的执行计划)executionStats(执行情况描述) nReturned (返回的文档个数) executionTimeMillis(执行时间ms) totalKeysExamined (检查的索引键值个数) totalDocsExamined (检查的文档个数)

    优化目标:
    :根据需求建立索引每个查询都要使用索引以提高查询效率,
    winningPlan. stage 必须为IXSCAN ;
    追求totalDocsExamined = nReturned

    索引建议:
    1、索引很有用,但是它也是有成本的——它占内存,让写入变慢;
    2、mongoDB通常在一次查询里使用一个索引,所以多个字段的查询或者排序需要复合索引才能更加高效;
    3、复合索引的顺序非常重要,例如此脚本所示:
    db.users.createIndex({username:1,age:-1})
    用了索引:db.users.find().sort({username:1,age:-1}).explain("executionStats")
    db.users.find().sort(.explain("executionStats")
    不用索引:db.users.find().sort({username:-1,age:-1}).explain("executionStats")
    不用索引:db.users.find().sort({age:-1,username:1}).explain("executionStats")
    4、在生成环境构建索引往往开销很大,时间也不可以接受,在数据量庞大之前尽量进行查询优化和构建索引;
    5、避免昂贵的查询,使用查询分析器记录那些开销很大的查询便于问题排查;
    6、通过减少扫描文档数量来优化查询,使用explain对开销大的查询进行分析并优化;
    7、索引是用来查询小范围数据的,不适合使用索引的情况:
    8、每次查询都需要返回大部分数据的文档,避免使用索引写比读多</pre>

    相关文章

      网友评论

          本文标题:MongoDB创建索引

          本文链接:https://www.haomeiwen.com/subject/izqbvctx.html