一.功能特性比对
1.数据查询操作
这个区别在用户接口上了,MongoDB 与传统的数据库系统类似,支持动态查询,即使在没有建立索引的行上,也能进行任意的查询。而 CouchDB 不同,CouchDB 不支持动态查询,你必须为你的每一个查询模式建立相应的view,并在此view的基础上进行查询。
2.REST
CouchDB 是一个RESTFul 的数据库,其操作完全走HTTP协议,而MongoDB是走的自己的二进制协议。MongoDB Server在启动时可以开放一个HTTP 的接口供状态监控。
如图为CouchDB特性,提前建立好的一个view,统计某key的对应value总值,查询走HTTP协议。
MVCC(Multiversion concurrency control)
MongoDB 与 CouchDB 的一大区别就是CouchDB 是一个MVCC的系统,而MongoDB是一个update-in-place 的系统。这二者的区别就是,MongoDB 进行写操作时都是即时完成写操作,写操作成功则数据就写成功了,而CouchDB 一个支持多版本控制的系统,此类系统通常支持多个结点写,而系统会检测到多个系统的写操作之间的冲突并以一定的算法规则予以解决。
如图为CouchDB一个文档示例:
4.原子性
这一点上两者比较一致,都支持针对行的原子性修改(concurrent modifications of single documents),但不支持更多的复杂事务操作。
5.与Java的结合
mongodb有spring data;couchdb可见文章 https://wiki.apache.org/couchdb/Getting_started_with_Java 在github里边,文章中 的Ektorp框架的关注度最高。
适用场景
1.如果你在构建一个 Lotus Notes 型的应用,我们推荐使用CouchDB,主要是由于它的MVCC机制。另外如果我们需要master-master 的架构,需要基于地理位置的数据分布,或者在数据结点可能不在线的情况下,我们推荐使用CouchDB。
如果你需要高性能的存储服务,那我们推荐 MongoDB,比如用于存储大型网站的用户个人信息,比如用于构建在其它存储层之上的Cache层。
如果你的需求中有大量 update 操作,那么使用MongoDB吧。就像我们在例子updating real time analytics counters 中的一样,对于那种经常变化的数据,比如浏览量,访问数之类的数据存储。
2.从应用的角度来说,CouchDB也有一些优势:
2.1 Schema Free,对于使用关系数据库的coder来说,理解很简单,整个couchdb的database只有一张表,而且每条记录是schema free的,每条记录就是一个document。简单使用map-reduce去查询,同时可以物化(view)一遍加速查询,这点就反映了CouchDB适合做读多写少的应用场景。
2.2 Replication,非常容易Replicate
2.3 使用Restful API, K/V,Document数据库,Json一目了然,非常简单
2.4 用JS就能操作数据库,很好玩
2.5 HTML5移动领域的发展,PouchDB等的出现,配合CouchDB很方便做一些离线web应用的Demo
三.写入效率、统计效率
1.环境:
2.0.0
2.效率比对图表(单位毫秒):
2.1 1672074条数据,统计各PID字段总条数
2.2 循环插入1000条数据
2.3 插入1条数据
3.具体数据:
1672074
MONGO GROUP cost time 6661
{_id=7015, count=12004}
{_id=7010, count=4077}
{_id=7014, count=20404}
{_id=7031, count=53442}
{_id=7029, count=39453}
{_id=7016, count=43708}
{_id=7002, count=78437}
{_id=7009, count=51115}
{_id=7022, count=75554}
{_id=7032, count=23804}
{_id=7017, count=24791}
{_id=7011, count=79232}
{_id=7026, count=49568}
{_id=7001, count=74835}
{_id=7006, count=79027}
{_id=7013, count=22861}
{_id=7019, count=69726}
{_id=7020, count=34524}
{_id=7004, count=79534}
{_id=7025, count=75704}
{_id=7018, count=78738}
{_id=7005, count=58337}
{_id=7008, count=28611}
{_id=7023, count=75753}
{_id=7027, count=24222}
{_id=7012, count=48597}
{_id=7007, count=66951}
{_id=7024, count=74812}
{_id=7003, count=72993}
{_id=7021, count=78363}
{_id=7028, count=72897}
COUCHDB GROUP cost time 669
{"rows":[
{"key":7001,"value":74835},
{"key":7002,"value":78437},
{"key":7003,"value":72993},
{"key":7004,"value":79534},
{"key":7005,"value":58337},
{"key":7006,"value":79027},
{"key":7007,"value":66951},
{"key":7008,"value":28611},
{"key":7009,"value":51115},
{"key":7010,"value":4077},
{"key":7011,"value":79232},
{"key":7012,"value":48597},
{"key":7013,"value":22861},
{"key":7014,"value":20404},
{"key":7015,"value":12004},
{"key":7016,"value":43708},
{"key":7017,"value":24791},
{"key":7018,"value":78738},
{"key":7019,"value":69726},
{"key":7020,"value":34524},
{"key":7021,"value":78363},
{"key":7022,"value":75554},
{"key":7023,"value":75753},
{"key":7024,"value":74812},
{"key":7025,"value":75704},
{"key":7026,"value":49568},
{"key":7027,"value":24222},
{"key":7028,"value":72897},
{"key":7029,"value":39453},
{"key":7031,"value":53442},
{"key":7032,"value":23804}
]}
3.2 插入1000条数据
MONGO LOOP INSERT ONE DATA cost time 699
COUCHDB LOOP INSERT ONE DATA cost time 41452
3.3 插入1条数据
MONGO INSERT ONE DATA cost time 118
COUCHDB INSERT ONE DATA cost time 385
四.关于另一个NOSQL——CouchBase
我在win10上安装CouchBase无法成功,在CentOS安装成功,版本4.5.0-2601 Community Edition (build-2601)
以下列出我近期对CouchBase的一些学习内容:
1.CouchBase与CouchDB一样,也可在WEB端管控数据。
2.CouchBase支持N1QL (一种类似SQL的用于JSON的查询语言)
CouchBase = CouchDB + MemBase
但是,CouchBase并非CouchDB的新版本,相反,它实际上是MemBase的新版本。CouchBase Server实际上是MemBase Server的新名字
4.与CouchDB类似,使用MapReduce功能,要先建立view,在view里写MapReduce。我建立的查询pid出现次数的view结果如下(查询速度很快):
但图中的values值偏差很大,查资料猜测可能是“延后写入 ”功能,我至今还不知道怎么解决。
5.Java对其的支持有com.couchbase.client-java-client,用它调用CouchBase进行数据插入,循环单插1000条数据,花费2215毫秒, 插入1条花费169毫秒。
五.其它
1.从这几天研究来看,在CentOS系统上安装MongoDB较容易,但CouchDB安装时较多坑,CouchDB依赖于ErLang语言,我编译安装时遇到Erlang的crypto模块与openssl动态链接库不兼容的问题,至今还未解决,所以转而到WIN上进行学习、测试。
2.批量导入数据
2.1 MongoDB导入批量数据很方便
mongoimport -d 数据库名 -c 文档名 文件路径/文件名json.txt
json.txt内容形如:
{"c1":"v1","c2":"v2"}
{"c1":"v11","c2":"v22"}
2.2 CouchDB导入批量数据,我还没搞清楚怎么操作,上文中的170W条数据,我用自己写的Java代码,从MongoDB源取出批量数据的list,再遍历list,一次次发送POST请求,循环导入到CouchDB,耗时15小时。
2.3 CouchBase有官方提供的批量导入Json文件工具,需将每个Json存成单独的一个文件,将这些批量文件按规范压缩。170W个Json文件,我的机器没法跑出来,于是我采用的方式是将MongoDB里查出的170W的list,循环遍历存入CouchBase,使用com.couchbase.client-java-client,耗时20分钟。
3.上文中的Group测试,对于MongoDB,我使用的是aggregate,脚本即
db.playerData.aggregate([{$group:{_id:"$pid",num:{$sum:1}}}]);
6661毫秒,小于使用MapReduce的情景,MapReduce的效果如图:
4.关于MongoDB的group与MapReduce的一些整理如下:
4.1 不要用 group是因为它返回的list内存值,在查询结果条数大 10000 keys 的情况下会爆出异常。
4.2 据我周围用过MongoDB的朋友说,其MapReduce性能并不是十分显著,但用得好的话,有可提升的空间。
MongoDB 黑客赎金事件,原因是MongoDB在访问控制方面无强性要求,一些公司部署产品时采取较低访问控制权限。
参考文章:
http://blog.nosqlfan.com/html/1519.html
https://www.zhihu.com/question/20112928