mongodb读写性能分析之(写)

【写】

可能影响插入数据性能评估:服务器硬件、索引(建立过多索引)、插入时是否指定_id、单机or分片、是否副本集、是否安全写入

  • 数据库版本:v2.6
  • 插入样本数据大小:约500byte
  • 测试脚本:如下
       
       
    1. for(var i =1; i <= 100000; i++){
    2. db.ActivityResultShard.insert({
    3. "Aid" : "56aacfd4d4307006200d0bac",
    4. "Cid" : 111,
    5. "At" : "56aacfd4d4307006200d0bac",
    6. "Time" : ISODate("2017-03-28T09:35:05.779Z"),
    7. "EvtN" : null,
    8. "Evt" : null,
    9. "As" : 0,
    10. "Mis" : {
    11. "Mid" : "e3196ec3-b624-4b11-a5e7-df7c4400ba75",
    12. "Mt" : "asdf",
    13. "Ms" : 1,
    14. "Filter" : [
    15. {
    16. "Fs" : true,
    17. "Exp" : "Evt.Amount>0",
    18. "Pro" : "GetInfo"
    19. }
    20. ],
    21. "Rew" : [
    22. {
    23. "Rid" : "123",
    24. "Ra" : "",
    25. "Rs" : 0
    26. }
    27. ]
    28. }
    29. });
    30. }

    硬件对比

    硬件 客户端 基数 样本数 常驻内存 索引 耗时 tps
    1.72 8G VMware 64位Linux Robomongo 0 10万 295m _id,大小:24m 638s 157
    1.72 8G VMware 64位Linux mongo shell 0 10万   _id,大小:24m 116s 862
    1.72 8G VMware 64位Linux C# Client 单线程 0 10万   _id,大小:24m 268s 373
    8G i7 SSD 64位win7 mongo shell 0 10万   _id,大小:24m 27s 3703
    8G i5 SSD 64位win7 mongo shell 0 10万   _id,大小:24m 54s 1852

    索引对比

    测试硬件:1.72 8G VMware 64位Linux 
    操作客户端:mongo shell (单线程) 
    索引:未指定_id,未指定其他索引键值

    基数 样本数 索引 耗时 tps
    0 10万 _id 104s 961
    10万 40万 _id 410s 975
    50万 50万 _id 463s 1079
    0 10万 _id、Aid、Cid、Mis.Mid 126s 764

    集群对比

    测试硬件集群:101.41、101.42、101.43 4G VMware 64位Linux 
    操作客户端:mongo shell (单线程) 
    索引:未指定_id,未指定其他索引键值

    分片键 基数 样本数 索引 耗时 tps
    未指定分片键 0 10万 _id 425s 235
    Aid 0 10万 _id、Aid 332s 301
    Aid、Mis.Mid(内嵌文档) 0 10万 _id、Aid 未测,等DBA建分片键  

    安全写入对比

    在2012年11月之前,MongoDB驱动、shell客户端默认是不安全写入,也就是fire-and-forget,动作发出之后,不关心是否真的写入成功,如果这时候出现了_id重复、非UTF8字符等异常,客户端不会知道。在2012年11月之后,默认为安全写入,安全级别相当于参数w=1,客户端可以知道写入操作是否成功。如果代码使用Mongo或者Collection来连接数据库,则说明它是默认不安全写入的legacy代码,安全写入已经把连接数据库修改为MongoClient接口。 
    安全写入可以分为三个级别:

    1. 第一级是默认的安全写入,确认数据写入到内存中就返回(w=N属于这一级);
    2. 第二级是Journal save,数据在写入到DB磁盘文件之前,MongoDB会先把操作写入到Journal文件,这一级指的是确认写入了Journal文件就返回;
    3. 第三级是fysnc,所有数据刷写到到DB磁盘文件才返回。

    一般第一级就足够了,第二级是为了保证在机器异常断电的情况下也不会丢失数据。安全写入要付出性能的代码:不安全写入的性能大概是默认安全写入的3倍。使用fync参数则性能更差,一般不使用。 
    如果是副本集(replica set),其w=N参数,N表示安全写入到多少个副本集才返回。

  • 本文转自:https://www.zybuluo.com/zero1036/note/708431


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值