当前位置:   article > 正文

mongodb读写性能分析

mongodb读写性能

mongodb读写性能分析

标签(空格分隔): Mongodb


【写】

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

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

硬件对比

硬件客户端基数样本数常驻内存索引耗时tps
1.72 8G VMware 64位LinuxRobomongo010万295m_id,大小:24m638s157
1.72 8G VMware 64位Linuxmongo shell010万_id,大小:24m116s862
1.72 8G VMware 64位LinuxC# Client 单线程010万_id,大小:24m268s373
8G i7 SSD 64位win7mongo shell010万_id,大小:24m27s3703
8G i5 SSD 64位win7mongo shell010万_id,大小:24m54s1852

索引对比

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

基数样本数索引耗时tps
010万_id104s961
10万40万_id410s975
50万50万_id463s1079
010万_id、Aid、Cid、Mis.Mid126s764

集群对比

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

分片键基数样本数索引耗时tps
未指定分片键010万_id425s235
Aid010万_id、Aid332s301
Aid、Mis.Mid(内嵌文档)010万_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表示安全写入到多少个副本集才返回。

参考:
http://docs.mongodb.org/manual/release-notes/drivers-write-concern/
http://docs.mongodb.org/manual/core/write-concern/
http://blog.mongodirector.com/understanding-durability-write-safety-in-mongodb/
http://whyjava.wordpress.com/2011/12/08/how-mongodb-different-write-concern-values-affect-performance-on-a-single-node/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/734360
推荐阅读
相关标签
  

闽ICP备14008679号