我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MongoDB实战(7)索引与性能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MongoDB实战(7)索引与性能

一、索引

MongoDB提供了多样性的索引支持索引信息被保存在system.indexes中且默认总是为_id
创建索引。

1、基础索引

在字段age上创建索引1(升序);-1(降序)

MongoDB实战(7)索引与性能

上例显示出来的一共有2个索引其中_id是创建表的时候自动创建的索引此索引是不能
够删除的。

当系统已有大量数据时创建索引就是个非常耗时的活我们可以在后台执行只需指定
“backgroud:true”即可。

db.stu.ensureIndex({age:1},{background:1})

2、文档索引

索引可以任何类型的字段甚至文档

db.stu.insert({_id:3,name:'user2',age:12,addr:{city:'beijing',state:"BJ"}})
db.stu.insert({_id:4,name:'user2',age:12,addr:{city:'shanghai',state:"SH"}})
db.stu.ensureIndex({addr:1})

下面这个查询将会用到我们刚刚建立的索引

db.stu.find({addr:{city:'beijing',state:'BJ'}})
"_id" : 3, "name" : "user2", "age" : 12, "addr" : { "city" : "beijing", "state" : "BJ" } }

而下面的查询却不能查到结果

db.stu.find({addr:{state:'BJ',city:'beijing'}})

MongoDB实战(7)索引与性能

3、组合索引

跟其它数据库产品一样MongoDB也是有组合索引的下面我们将在addr.city和addr.state
上建立组合索引。当创建组合索引时字段后面的1表示升序-1表示降序是用1还是
用-1主要是跟排序的时候或指定范围内查询的时候有关的。

db.stu.ensureIndex({'addr.city':1,'addr.state':1})

下面的查询都用到了这个索引

MongoDB实战(7)索引与性能

MongoDB实战(7)索引与性能

4、唯一索引

只需在ensureIndex命令中指定”unique:true”即可创建唯一索引。

db.t4.ensureIndex({firstname: 1, lastname: 1}, {unique: true});

当建唯一索引时如果表中有2条一模一模的数据就建立不了唯一索引。

5、强制使用索引

hint命令可以强制使用某个索引。

db.stu.ensureIndex({name:1,age:1})

则下面不能使用索引

MongoDB实战(7)索引与性能

使用hint强制使用索引

MongoDB实战(7)索引与性能

6、删除索引

#删除t3 表中的所有索引
db.t3.dropIndexes()
#删除t4 表中的firstname 索引
db.t4.dropIndex({firstname: 1})

二、explain执行计划

MongoDB提供了一个explain命令让我们获知系统如何处理查询请求。利用explain命令
我们可以很好地观察系统如何使用索引来加快检索同时可以针对性优化索引。

几个关键的字段说明:
cursor:返回游标类型(BasicCursor或BtreeCursor)
nscanned:被扫描的文档数量
n:返回的文档数量
millis:耗时(毫秒)
indexBounds:所使用的索引

三、优化器profile

在MySQL中慢查询日志是经常作为我们优化数据库的依据那在MongoDB中是否有类似
的功能呢?答案是肯定的那就是MongoDBDatabaseProfiler。所以MongoDB不仅有而且
还有一些比MySQL的SlowQueryLog更详细的信息。

1、开启Profiling功能

有两种方式可以控制Profiling的开关和级别第一种是直接在启动参数里直接进行设置。
启动MongoDB时加上–profile=级别即可。
也可以在客户端调用db.setProfilingLevel(级别)命令来实时配置Profiler信息保存在
system.profile中。我们可以通过db.getProfilingLevel()命令来获取当前的Profile级别。

profile的级别可以取012三个值他们表示的意义如下
0–不开启
1–记录慢命令(默认为>100ms)
2–记录所有命令

MongoDB实战(7)索引与性能

Profile记录在级别1时会记录慢命令那么这个慢的定义是什么?上面我们说到其默认为
100ms当然有默认就有设置其设置方法和级别一样有两种一种是通过添加–slowms启
动参数配置。第二种是调用db.setProfilingLevel时加上第二个参数

db.setProfilingLevel(1,10);

2、查询Profiling记录

与MySQL的慢查询日志不同MongoDBProfile记录是直接存在系统db里的记录位置
system.profile所以我们只要查询这个Collection的记录就可以获取到我们的Profile记
录了。列出执行时间长于某一限度(5ms)的Profile记录

db.system.profile.find( { millis : { $gt : 5 } } )

{
"op" : "command",
"ns" : "test.$cmd",
"command" : { "count" : "orders", "query" : {  }, "fields" : {  } },
"ntoreturn" : 1,
"keyUpdates" : 0,
"numYield" : 0,
"lockStats" : { "timeLockedMicros" : { "r" : NumberLong(11494), "w" : NumberLong(0) }, "timeAcquiringMicros" : { "r" : NumberLong(4), "w" : NumberLong(5) } },
"responseLength" : 48,
"millis" : 11,
"ts" : ISODate("2013-11-16T13:52:38.391Z"),
"client" : "127.0.0.1",
"allUsers" : [ ],
"user" : ""
}

查询最新的一条可以使用如下命令

db.system.profile.find().sort({$natural:-1}).limit(1)

MongoDBShell还提供了一个比较简洁的命令showprofile可列出最近5条执行时间超过
1ms的Profile记录。

Profiling功能肯定是会影响效率的但是不太严重原因是他使用的是system.profile来记
录而system.profile是一个cappedcollection这种collection在操作上有一些限制和特点
但是效率更高。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MongoDB实战(7)索引与性能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MongoDB慢查询与索引实例详解

目录MongoDB慢查询MongoDB索引总结 MongoDB慢查询慢查询分析开启内置的慢查询分析器db.setProfilingLevel(n,m),n的取值可选0,1,20:表示不记录1:表示记录慢速操作,如果值为1,m需要传慢查
2022-07-29

MongoDB的文本搜索与全文索引怎么实现

MongoDB中的文本搜索和全文索引可以通过创建文本索引来实现。文本索引可以帮助MongoDB在文本字段上执行全文搜索,以查找包含特定关键词或短语的文档。要在MongoDB中实现文本搜索和全文索引,可以按照以下步骤操作:创建文本索引:使用
MongoDB的文本搜索与全文索引怎么实现
2024-05-07

异步协程开发实战:构建高性能的实时搜索引擎

异步协程开发实战:构建高性能的实时搜索引擎引言:在当今大数据时代,高性能的实时搜索引擎对于处理海量数据、提供快速准确的搜索结果变得越来越重要。而异步协程开发技术的出现,为我们构建高性能的实时搜索引擎提供了一种全新的解决方案。本文将深入探讨什
异步协程开发实战:构建高性能的实时搜索引擎
2023-12-09

PHP 消息队列实战与性能优化

php 中的消息队列是一种异步处理消息的机制,广泛应用于任务调度等场景。实战案例:使用 beanstalkd 管理异步任务,包括添加任务、设置延时和从队列获取任务。性能优化技巧:使用持久化连接批量处理消息异步处理限制队列大小监视死信队列注意
PHP 消息队列实战与性能优化
2024-05-01

PHP与MySQL索引的数据更新和索引维护的性能优化策略及其对性能的影响

摘要:在PHP与MySQL的开发中,索引是优化数据库查询性能的重要工具。本文将介绍索引的基本原理和使用方法,并探讨索引对数据更新和维护的性能影响。同时,本文还提供了一些性能优化策略和具体的代码示例,帮助开发者更好地理解和应用索引。索引的基本
2023-10-21

MongoDB开发经验分享:高效利用索引提升查询性能

MongoDB是一种非关系型数据库管理系统(NoSQL DBMS),它以其灵活性和可扩展性而闻名。作为一个使用MongoDB进行开发的经验丰富的开发者,我想分享一些关于如何高效利用索引提升查询性能的经验和技巧。首先,理解MongoDB的索引
MongoDB开发经验分享:高效利用索引提升查询性能
2023-11-02

PHP 数组索引与值互换:深入解析与性能比较

php 数组索引与值互换可通过 array_flip() 函数或手动交换法实现。array_flip() 函数快速便捷,而手动交换法更灵活。性能方面,array_flip() 一般优于手动交换法,尤其针对大数组。PHP 数组索引与值互换:深
PHP 数组索引与值互换:深入解析与性能比较
2024-05-04

PHP与MySQL索引的查询语句优化和索引返回的性能优化策略及其对性能的影响

数据库是现代应用开发中不可或缺的一部分,而针对数据库的查询语句优化和索引返回的性能优化是开发人员应该重点关注的问题。索引是一种用于提高数据库查询效率的重要数据结构,它通过在表中创建特定字段的索引来加速数据的查找和排序过程。本文将重点讨论PH
2023-10-21

Elasticsearch核心技术与实战,性能是真牛

Elasticsearch 是一款非常强大的开源搜索及分析引擎。结合 Kibana、Logstash和Beats,Elasticsearch 还被广泛运用在大数据近实时分析,包括日志分析、指标监控、信息安全等多个领域。在国内,阿里巴巴、腾讯、滴滴、今日头条、3
Elasticsearch核心技术与实战,性能是真牛
2014-12-30

RiSearch PHP 高性能搜索引擎的实际应用

导语:随着互联网的迅猛发展,搜索引擎已经成为人们获取信息的主要途径之一。而针对大数据的高性能搜索引擎也变得尤为重要。RiSearch是一种PHP搜索引擎,被广泛应用于各种网站和应用程序中,具有高效、可靠和易于使用的特点。本文将重点介绍RiS
2023-10-21

MySQL性能优化与索引设计的项目经验总结

MySQL是一种常用的关系型数据库管理系统,广泛应用于各种Web应用和企业级系统中。在开发和维护MySQL数据库时,性能优化和索引设计是非常关键的环节。本文将基于作者在项目中的经验总结MySQL性能优化和索引设计的一些实践方法和技巧。一、了
MySQL性能优化与索引设计的项目经验总结
2023-11-02

编程热搜

目录