Indexes

和全部db一样,索引肯定都会引起写性能的下降,mongodb也没啥特别的,相对索引对读性能的提示,这些消耗通常是能够接受的,所以该加入的索引还是要加入。当然须要慎重一些。扯点远的,以前我碰到过一个case。由于一个表的索引数量太多,导致兴许磁盘的util越来越高,达到70%。而刚加入的副本集成员磁盘uitl才20%不到。

后来发现是由于索引太多。越到后面造成的索引碎片也就越来越多。后来的处理方法是定期都挨个重做副本集的成员。

Document Growth and the MMAPv1 Storage Engine

一些更新操作会添加一个文档的大小。比方给一个文档再加入一列。对于MMAPv1的存储引擎,假设一个更新操作引起这个文档大小超过了之前申请的record size,mongodb将会在硬盘上又一次迁移使得保证有足够的空间存储这整个文档(这点类似于oracle的行迁移)。这个迁移操作将比不迁移的情况消耗更长的时间和代价,尤其是这个文档上有索引的话,由于假设这个文档有索引的话,mongodb必须更新它的全部的索引。因此假设一个文档有非常多索引的话,这个迁移将会影响到写入的吞吐量。

在mongodb3.0中,默认的情况下mongodb用2的指数形式来自己主动添加文档空间。2的指数大小能保证mongodb高效地反复利用剩下空间。同一时候也能在非常多情况下降低迁移的次数。

当然这样的2的指数形式尽管能降低又一次申请空间的次数。但却还是无法全然根除该操作。

Journaling

mongodb使用预先写journal log到磁盘的方式保证写操作的持久性。从而可以中崩溃中恢复(类似于关系数据库的redo log)。

在将数据写到数据页之前,它会先将其写入到journal log。

虽然journal log提供的持久性特性通常比它所须要的写性能消耗更重要。我们还是须要在持久化和写性能之间做一个权衡。

1 假设journal log和数据文件在同一块磁盘,数据页和journal将不可避免地存在写竞争。建议将journal log移到另外一块单独的磁盘也许能够提升写性能

2 假设上文提到的write concern设置了journal级别,mongod一般来说都会减少两次journal log之间的提交间隔(由于提交间隔太长。write concern设置后一次写操作将会花非常长时间),这样就会添加写负载。关于write concern,请參考我的另外一篇blog,http://blog.csdn.net/cug_jiang126com/article/details/47399133

3 可通过调整commitIntervalMs 參数动态改动journal
log的提交间隔,降低该值会添加写操作的次数,添加该值可降低写操作的次数,可是会添加数据丢失的风险。由于在这个提交间隔内。假设db崩溃了。那么这段时间内的数据是无法恢复的。

mongodb官网文档阅读笔记:与写性能相关的几个因素的更多相关文章

  1. mongodb官网文档阅读笔记:write concern

    write concern保证了mongodb写操作的级别,不同的write concern设置相应了不同级别的写操作.设置的级别越高.那么写操作的性能的持久化做得越好,可是写性能也就越差. mong ...

  2. Spark Streaming + Flume整合官网文档阅读及运行示例

    1,基于Flume的Push模式(Flume-style Push-based Approach)      Flume被用于在Flume agents之间推送数据.在这种方式下,Spark Stre ...

  3. Spring3.0官网文档学习笔记(八)--3.4.3~3.4.6

    3.4.3 使用depends-on     使用depends-on能够强制使一个或多个beans先初始化,之后再对这个bean进行初始化. 多个bean之间用","." ...

  4. Spring3.0官网文档学习笔记(一)

    Part 1 Spring框架概述 Spring是模块化的,在应用中仅仅须要引入你所须要用到的模块的jar包,其余的jar包不用引入. spring框架支持声明式的事务管理,通过RMI或web ser ...

  5. Spring3.0官网文档学习笔记(七)--3.4.2

    3.4.2 依赖与配置的细节     3.4.2.1  Straight values (primitives, Strings, and so on)     JavaBeans PropertyE ...

  6. Spring3.0官网文档学习笔记(二)

    1.3 使用场景 典型的成熟的spring web应用 spring使用第三方框架作为中间层 远程使用场景 EJB包装 1.3.1 依赖管理.命名规则(包)     spring-*.jar *号代表 ...

  7. android官网文档学习笔记

    1.android的四大组件的了大概功能 activity:负责显示界面,和用户交互. service:运行在后台. content provider:为程序app之间的数据访问提供接口. broad ...

  8. Spring3.0官网文档学习笔记(四)--3.1~3.2.3

    3.1 Spring IoC容器与Beans简单介绍     BeanFactory接口提供对随意对象的配置:     ApplicationContext是BeanFactory的子接口.整合了Sp ...

  9. 你会阅读appium官网文档吗

    高效学习appium第一步,学会查看appium官方文档.如果能把appium文档都通读一遍,对学习appium大有益处. 而能做到通读appium官方文档的人,想必不是很多,刚开始学习appium的 ...

随机推荐

  1. ActiveMQ学习总结(4)——业界消息队列简介

    最近开发公司的短信平台,要用到消息队列,之前用的是亚马逊的SQS,考虑到后续业务发展,对消息推送的高并发要求,公司决定采用RabbitMQ来替换.借此机会开始熟悉各种MQ产品,下面先给大家简介下业界常 ...

  2. CODEVS——T 1269 匈牙利游戏 2012年CCC加拿大高中生信息学奥赛

    http://codevs.cn/problem/1269/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Descript ...

  3. dubbo标签

    <dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心. <dubbo:reference/&g ...

  4. Ubuntu: GlusterFS+HBase安装教程

    HBase通常安装在Hadoop HDFS上,但也能够安装在其它实现了Hadoop文件接口的分布式文件系统上.如KFS. glusterfs是一个集群文件系统可扩展到几peta-bytes. 它集合了 ...

  5. 关于sql中的with(nolock)

    SQL Server 中的 NOLOCK 究竟是什么意思 一般用于此类语句中:select * from t with(NOLOCK) nolock是不加锁查询.能够读取被事务锁定的数据,也称为脏读. ...

  6. IP地址正則表達式

    正則表達式对字符进行格式化匹配.一句指令完毕推断. IP地址格式   x.x.x.x x 表示0~255的数字 分三种情况 A.          250-255:特点:三位数,百位是2,十位是5,个 ...

  7. [Struts2] No result defined for action ... and result input &amp; Invalid field value for field ...

    "No result defined for action ... and result input"错误一般发生在Struts2的拦截器拦截时遇到了问题时.Struts2会将跳转 ...

  8. Forms authentication timeout vs sessionState timeout

    https://stackoverflow.com/questions/17812994/forms-authentication-timeout-vs-sessionstate-timeout Th ...

  9. java监听多个组件

    import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.*; import javax.swing.*; pu ...

  10. js小知识colspan和rowspan

    colspan和rowspan这两个属性用于合并表格的列或者行. colspan是"column  span"(跨列)的缩写,所以colspan属性用在td标签中,用来跨列合并单元 ...