@zero1036
2017-04-05T00:36:26.000000Z
字数 1962
阅读 3481
Mongodb
可能影响插入数据性能评估:服务器硬件、索引(建立过多索引)、插入时是否指定_id、单机or分片、是否副本集、是否安全写入
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}]}});}
| 硬件 | 客户端 | 基数 | 样本数 | 常驻内存 | 索引 | 耗时 | 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接口。
安全写入可以分为三个级别:
一般第一级就足够了,第二级是为了保证在机器异常断电的情况下也不会丢失数据。安全写入要付出性能的代码:不安全写入的性能大概是默认安全写入的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/