语法:
db.collection.createindex(keys,options ) options属性说明:
索引范例:
单密钥唯一索引: db.users.create index (username :1 ),{unique:true} ); 单密钥的唯一稀疏索引: db.users.create index (username :1 ),{unique:true,sparse:true} ); 复合唯一稀疏索引: db.users.create index (username :1,age :99 Come Come Everybody1),{unique:true,sparse:true} ); 创建散列索引并在后台运行: db.users.create index (username : ' hashed ' },{background:true} ); 删除索引示例:
根据索引名称,删除指定索引: db.users.drop index (username1 ); 集合上的所有索引:db.users.dropIndexs (集合上的所有索引:db.users.reIndex (; 集合上的所有索引:db.users.getIndexes (;查询优化技巧:
第一步:找出慢速查询
打开内置的查询分析器,记录读写操作效率:db.setprofilinglevel(N,),可取值为0、1、
0是默认值,表示不记录。
1表示记录慢速操作,如果值为1,则必须分配ms单位来定义慢速查询时间阈值。
表示将记录所有读写操作
例如: db.setprofilinglevel (1,300 )询问监测结果
监测结果存储在特殊的盖集合system.profile中,该集合分配128kb空间,使监测分析数据不占用太多系统资源; 封口套保持着自然的插入顺序,KaTeX parse error: Expected '}、got ' eof ' atendofinput 3360 . find (.sort (' natural ' 336099 )
第二步:分析慢速查询
很难确定低速查询的原因。 原因可能是多个:应用程序设计不当、数据模型不正确、硬件配置问题和索引不足。 接着对没有索引情况进行分析:
使用explain分析慢速查询
例如, db.orders.find“price”:“$ lt”:2000 }.explain (execution stats ) explain的加入选项值是3360
" queryPlanner "为默认值,表示只显示执行计划信息。
“执行状态”表示与选择的执行计划的执行状况信息一起表示执行计划信息;
" allPlansExecution "表示执行计划信息,表示选择的执行计划的执行状况信息,还表示代替的执行计划的执行状况信息
解读步骤explain的结果
queryPlanner (说明计划) )
winningPlan (选定的执行计划) )。
stage (可选:COLLSCAN未建立索引; IXSCAN使用了索引候选的执行计划)
executionStats(执行情况描述)
nReturned (返回的文档数) )。
执行时间ms )。
totalKeysExamined (要检查的索引键的数量) ) ) ) ) ) ) ) )。
totalDocsExamined (要检查的文档数量) ) ) ) ) ) ) ) ) )。
优化目标Tips:
1 .根据需要编制索引
为了通过对每个查询使用索引来提高查询效率,winningPlan. stage必须是IXSCAN;
w3 .追求totaldocsexamined=nreturned
测试用例: db.orders.find(usecode(: ) jack,) order time : ($ lt ) :newdate ) 201799 Come Come Everybody 0899 Come Come Everybody 03t 16336000000
可以看出,一共检查了1060007个文档,返回了88560个文档,运行了299ms。 stage是COLLSCAN,没有使用索引。
上诉优化程序:
1 .找到慢速查询:
当运行db.setprofilinglevel (1,100 )时,将显示以下集合之一:
接下来,运行测试语句。
db.orders.find(usecode(: ) jack,) ordertime ) :($lt ) :newdate ) 201799 Come Come Everybody 0899 Come Come Everybody 03t 16363600000003360
db.system.profile.find ().sort ($ natural ' :99 Come Come Everybody1) ).limit(5) )5).pretty ) )。
2.分析慢速查询
db.orders.find(usecode(: ) jack,) ordertime ) :($lt ) :newdate ) 201799 Come Come Everybody 0899 Come Come Everybody 03t 16363600000003360
发现没有索引。
1创建密钥索引:
db.orders.create index (' usecode ' :99 Come Come Everybody1) )。
快了一点
.创建复合索引
db.orders.create index (' usecode ' :1,' orderTime':1} )
符合我们的优化目标(扫描文档数跟返回数是一样的),但是时间却长了,所以建索引还是要以实践为主,扫描的文档数少不一定能提高效率。
后来发现这个索引更快:
db.orders.create index (usecode : ), collation : } locale : ' fr ' } ) db.orders.find )' usecode ' } ' order time ' :' $ lt ' 3:新日期(2010 )
介绍此用法的地址: https://docs.MongoDB.com/manual/reference/command/create indexes/index.html
关于索引的建议:
索引很方便,但成本高昂的——,占用内存并降低写入速度。
mongoDB通常在一次查询中使用一个索引,因此需要复合索引才能更有效地查询或排序多个字段。
复合索引的顺序非常重要
在生成环境中构建索引通常开销很大,时间也不可接受。 在数据量庞大之前进行查询优化和索引的构建
通过避免代价高昂的查询并使用查询分析器记录代价高昂的查询,可以更容易地排除问题
减少扫描的文档数量并优化查询,使用explai分析和优化开销较大的查询
索引用于查询小范围的数据,不适合使用索引。
每个8.查询都必须返回大多数数据的文档,而不要使用索引
9 .写作多于阅读
这篇文章同步到了我的个人公众号“java面试工程师”。 关注公众号,更容易查阅。