mongodb是一款文档型的非关系型数据库,性能非常高,老赵做过相关测试,我测试下来也差不多,和sql server相比,写入性能好太多了,下面是我的测试结果:
一条记录4K,1000万的数据占50G磁盘包括索引
Document doc = new Document();
doc.Add("Name", "Joseph" + DateTime.Now.Second); 索引
doc.Add("Age", r.Next(20, 50)); 索引
doc.Add("Time", DateTime.Now);
doc.Add("Data", s);
记录很少的时候写吞吐5000左右
记录很少的时候基于索引的搜索每秒2000左右
数据很少的时候读吞吐每秒1400
数据很少的时候4M数据获取大概237毫秒
数据很少的时候搜索对写入影响不大
数据很少的时候读写相互影响不大
数据很多的时候
写入速度下降一半
读取速度没区别
搜索慢了很多,千万数据200毫秒的搜索速度,2个字段
读取对写入影响还是不大
查询对写入影响很大
另 不管数据量多少CPU始终在10%以下,内存随着数据量增多从20% - 80%
查询:
Document doc = new Document();
doc.Add("Name", "Joseph10");
doc.Add("Age", new Document().Append("$gte", 30).Append("$lte", 40));
读取:
table.FindOne(new Document());
测试程序点击这里下载。测试基于单个master的mongodb,后续测试发现,如果开启master/slave的话,写入速度非常不稳定,在向slave传送数据的时候写入速度下降50%到80%。还有就是mongodb随着并发的上升并没有带来写入速度上的提高,反而下降了一点,可能是因为读写锁的关系。
另外,点击这里下载一个查看mongodb对象的小工具(基于MongoDB.Driver.dll):
列出服务器
列出数据库 表 索引
服务器属性
数据库属性
表属性
列数据
通过写这个工具我觉得,Document使用树形来表示还是很方便的。
我还在想怎么通过类似sql语句的方式查询mongodb,找到了一个gudusoft.gsqlparser,可以解析各种sql,拿来一用,点击这里下载通过sql语句操作mongodb的测试工具,这个工具还是非常原始的版本,只能进行最简单的crud,select不支持group having等子句:
其实把这些小工具组合在一起就是一个简单的mongodb客户管理工具。
在 http://www.mongodb.org/display/DOCS/List+of+Database+Commands 上作者列出了所有db的命令,我们可以通过提交command操作。
在 http://www.mongodb.org/display/DOCS/DBA+Operations+from+the+Shell 上作者列出了可以在mongod工具中做的一些操作,其实这些操作完全可以通过提交command来进行,因为mongod工具完全就是一个javascript写的,我们看一下源代码中的mongo_vstudio.cpp:
;
比如我们知道可以从db shell中查看当前操作,但是不知道怎么在客户端中实现这个功能,可以找到这个文件中的:
"DB.prototype.currentOp = function(){\n"
"return db.$cmd.sys.inprog.findOne();}\n"
"DB.prototype.currentOP = DB.prototype.currentOp;\n"
"DB.prototype.killOp = function(op) {\n"
"if( !op )\n"
"throw \"no opNum to kill specified\";\n"
"return db.$cmd.sys.killop.findOne({'op':op});}\n"
"DB.prototype.killOP = DB.prototype.killOp;\n"
这几句,我想大家就知道怎么实现了吧。
mongodb是一个好东西,即使和sql server 性能差不多也是好东西(何况性能这么好),因为免费/开源,sql server多贵啊。不过呢,使用nosql还是要看应用的,mongodb的数据基于bson,列名都是重复保存的,所以占用的空间比较大一点,不太适合列数很多的数据,如果要保存日志的话甚至可以除了需要索引的字段都以一个字符串来保存。