首页 > 编程知识 正文

mongodb优化方案,mongodb设置索引

时间:2023-05-05 10:04:05 阅读:189785 作者:4165

语法:

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面试工程师”。 关注公众号,更容易查阅。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。