MongoDB性能优化

《MongoDB性能优化》要点:
本文介绍了MongoDB性能优化,希望对您有用。如果有疑问,可以联系我们。

一、索引

MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇.

1.基础索引

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

db.users.ensureIndex({age:1})

_id 是创建表的时候自动创建的索引,此索引是不能够删除的.当系统已有大量数据时,创建索引就是个非常耗时的活,我们可以在后台执行,只需指定“backgroud:true”即可.

db.t3.ensureIndex({age:1},{backgroud:true})

2.文档索引

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

MongoDB性能优化

db.factories.insert( { name: "wwl",addr: { city: "Beijing",state: "BJ" } } );

//在addr 列上创建索引

db.factories.ensureIndex( { addr : 1 } );

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

db.factories.find( { addr: { city: "Beijing",state: "BJ" } } );

//但是下面这个查询将不会用到索引,因为查询的顺序跟索引建立的顺序不一样

db.factories.find( { addr: { state: "BJ",city: "Beijing"} } );

MongoDB性能优化

3. 组合索引

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

db.factories.ensureIndex( { "addr.city" : 1,"addr.state" : 1 } );

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

db.factories.find( { "addr.city" : "Beijing","addr.state" : "BJ" } );

db.factories.find( { "addr.city" : "Beijing" } );

db.factories.find().sort( { "addr.city" : 1,"addr.state" : 1 } );

db.factories.find().sort( { "addr.city" : 1 } )

4. 唯一索引

只需在ensureIndex 命令中指定”unique:true”即可创建唯一索引.例如,往表t4 中插入2 条记录:

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

5.强制使用索引

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

db.t5.find({age:{$lt:30}}).hint({name:1,age:1}).explain()

6.删除索引

//删除t3 表中的所有索引

db.t3.dropIndexes()

//删除t4 表中的firstname 索引

db.t4.dropIndex({firstname: 1})

二、explain执行计划

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

MongoDB性能优化

db.t5.ensureIndex({name:1})

db.t5.ensureIndex({age:1})

db.t5.find({age:{$gt:45}},{name:1}).explain()

{

"cursor" : "BtreeCursor age_1",

"nscanned" : 0,

"nscannedObjects" : 0,

"n" : 0,

"millis" : 0,

"nYields" : 0,

"nChunkSkips" : 0,

"isMultiKey" : false,

"indexOnly" : false,

"indexBounds" : {

"age" : [

[45,1.7976931348623157e+308]

]

}

}

MongoDB性能优化

字段说明:

  • cursor: 返回游标类型(BasicCursor 或 BtreeCursor)

  • nscanned: 被扫描的文档数量

  • n: 返回的文档数量

  • millis: 耗时(毫秒)

  • indexBounds: 所使用的索引

三、优化器profile

在MySQL 中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB 中是否有类似的功能呢?答案是肯定的,那就是MongoDB Database Profiler.

1.开启profiling功能

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

db.setProfilingLevel(2);

上面profile 的级别可以取0,1,2 三个值,他们表示的意义如下:

  1. 0 – 不开启

  2. 1 – 记录慢命令 (默认为>100ms)

  3. 2 – 记录所有命令

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

db.setProfilingLevel( level,slowms )

db.setProfilingLevel( 1,10 );

2.查询 Profiling 记录

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

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

MongoDB Shell 还提供了一个比较简洁的命令show profile,可列出最近5 条执行时间超过1ms 的 Profile 记录.

四、常用性能优化方案

  1. 创建索引

  2. 限定返回结果数

  3. 只查询使用到的字段

  4. 采用capped collection

  5. 采用Server Side Code Execution

  6. 使用Hint,强制使用索引

  7. 采用Profiling

五、性能监控工具

1. mongosniff

此工具可以从底层监控到底有哪些命令发送给了MongoDB 去执行,从中就可以进行分析:以root 身份执行:

$./mongosniff --source NET lo

然后其会监控位到本地以localhost 监听默认27017 端口的MongoDB 的所有包请求.

2.Mongostat

此工具可以快速的查看某组运行中的MongoDB 实例的统计信息 字段说明:

  • insert: 每秒插入量

  • query: 每秒查询量

  • update: 每秒更新量

  • delete: 每秒删除量

  • locked: 锁定量

  • qr | qw: 客户端查询排队长度(读|写)

  • ar | aw: 活跃客户端量(读|写)

  • conn: 连接数

  • time: 当前时间

它每秒钟刷新一次状态值,提供良好的可读性,通过这些参数可以观察到一个整体的性能情况.

3. db.serverStatus

这个命令是最常用也是最基础的查看实例运行状态的命令之一.

4.db.stats

欢迎参与《MongoDB性能优化》讨论,分享您的想法,编程之家PHP学院为您提供专业教程。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读552次。com.mongodb.MongoQueryException: Query failed with error code 292 and error message 'Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.' on server 11.51.141.63:27017 _mongodb 大文件 下载失败
文章浏览阅读635次,点赞9次,收藏8次。MongoDB 是一种 NoSQL 数据库,它将每个数据存储为一个文档,这里的文档类似于 JSON/BSON 对象,具体数据结构由键值(key/value)对组成。
文章浏览阅读2.1k次。和。_mongodb 日期类型
文章浏览阅读1.7k次。Scalestack等客户期待使用MongoDB Atlas Vector Search和Amazon Bedrock构建下一代应用程序
文章浏览阅读970次。SpringBoot整合中间件mongodb、ES_springboot3 elasticsearch json数据
文章浏览阅读673次。MongoDB 简介_尚医通sql
文章浏览阅读1k次,点赞8次,收藏9次。官网下载MongoDB安装包后进行解压(因了解并不深入,故暂不进行详细说明,自行查找其他安装方法,后期了解深入后将进行该教程的完善)在bin目录下使用命令启动:./mongod --config …/mongodb.conf。该文章任然处于完善中,如果存在错误遗漏的地方,欢迎私信联系。安装相关的nuget包后即可通过以下方法连接数据。YX9010_0@的第二十篇文章。
文章浏览阅读1.2k次,点赞17次,收藏26次。社交场景, 使用 MongoDB 存储存储用户信息, 以及用户发表的朋友圈信息, 通过地理位置索引实现附近的人, 地点等功能.游戏场景, 使用 MongoDB 存储游戏用户信息, 用户的装备, 积分等直接以内嵌文档的形式存储, 方便查询, 高效率存储和访问.物流场景, 使用 MongoDB 存储订单信息, 订单状态在运送过程中会不断更新, 以 MongoDB 内嵌数组的形式来存储, 一次查询就能将订单所有的变更读取出来.物联网场景, 使用 MongoDB 存储所有接入的智能设备信息, 以及设备汇报的日
文章浏览阅读686次。您可以使用 update_one() 方法来更新 MongoDB 中调用的记录或文档。update_one() 方法的第一个参数是 query 对象,用于定义要更新的文档。注释:如果查询找到多个记录,则仅更新第一个匹配项。第二个参数是定义文档新值的对象。_python 更新 mongodb 数据
文章浏览阅读1.3k次。首先来学习一下nosql这里安装就不进行介绍 只记录一下让自己了解mongodb。_nosql注入
文章浏览阅读4.1k次,点赞8次,收藏7次。在data的目录下,创建一个db文件。因为启动MongoDB服务之前必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功。第一步:安装时,Custom是指可以自定义安装路径,然后傻瓜式安装即可(注意:先不要安装图形化工具,否则安装时间会特别长):如果要想连接成功,必须要开服务,即mongod -dbpath C:MongoDBdatadb的cmd要一直开着。然后回车,ctrl+F输入port找到端口号,一般为:27017。打开命令行,然后找到bin文件地址,并输入。_mongodb windows安装
文章浏览阅读5.1k次,点赞3次,收藏43次。详细介绍MongoDB数据库的基本知识,安装方法,基本操作,_mongodb数据库
文章浏览阅读3.2k次。安装教程翻看以往文章。_navicat 连接mongodb
文章浏览阅读426次,点赞9次,收藏12次。win10开放端口:https://blog.csdn.net/m0_43605481/article/details/119255256。我的是阿里云服务器,所以直接在安全组中加入规则,端口范围:27017,授权对象:0.0.0.0。windows在mongodb安装文件夹的bin文件夹中的mongod.cfg。数据库名字是test,打算创建一个用户,账号aaa,密码bbb,权限readWrite。因为该用户是创建在test数据库的,所以在最后要加上test。O了,然后恢复了test的数据。
文章浏览阅读1.1k次。聚合操作主要用于处理数据并返回计算结果。聚合操作将来自多个文档的值组合在一起,按条件分组后,再进行一系列操作(如求和、平均值、最大值、最小值)以返回单个结果。MongoDB的聚合查询​聚合是MongoDB的高级查询语言,它允许我们通过转化合并由多个文档的数据来生成新的在单个文档里不存在的文档信息。MongoDB中聚合(aggregate)主要用于处理数据(例如分组统计平均值、求和、最大值等),并返回计算后的数据结果,有点类似sql语句中的count(*)、groupby。..._如何将几个db的数据统整在一起做查询
文章浏览阅读680次,点赞7次,收藏8次。(2)application.properties配置文件。(4)UserService类。(5)测试和测试结果。
文章浏览阅读1k次,点赞17次,收藏25次。Studio 3T 2023.9 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端,支持自然语言查询_mongodb客户端
文章浏览阅读1.1k次,点赞32次,收藏27次。插件式的存储引擎架构可以实现 Server 层和存储引擎层的解耦,可以支持多种存储引擎,如 MySQL 既可以支持 B-Tree 结构的 InnoDB 存储引擎,还可以支持 LSM 结构的 RocksDB 存储引擎。MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。的简称,是 JSON 文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中,还包含允许表示不属于 JSON 规范的数据类型的扩展。
文章浏览阅读5.1k次,点赞6次,收藏96次。本文设计了一种基于智能室内温度控制的自动调速风扇。以STM32系列单片机为核心主控板,通过程序代码驱动和使用温度传感器模块实现对环境温度的实时监测,并可以实时显示环境温度。同时,可以设置温度检测的上下警告值,根据需求自行调节。_stm32 温控风扇
文章浏览阅读898次,点赞13次,收藏21次。在MongoDB中,我们使用find()和find_one()方法来在集合中查找数据,就像在MySQL数据库中使用SELECT语句来在表中查找数据一样。_pymongo find_one