CouchDB用起来可能不是很舒服

最近我花了一个星期研究NoSQL,我有一个400万记录的MySQL速度比较慢,准备迁移到NoSQL上,因为主要是一些JSON格式的文档,本来序列化存在MySQL中的,因为看上了Erlang这个号称非常牛X的平台,挑中了CouchDB,但导入40万有效测试数据,在本地运行的时候,发现速度特别慢(本地机器为2011年的iMac,配备16G内存,根本不弱的),而且查询功能很弱,可能还没到成熟的时候。

CouchDB特点:

面向文档数据库,不需要范式,直接存储JSON就可以,CouchDB默认会生成 _id,_rev 两个键,_id是一条记录(文档)的唯一标识,如果不提供_id,_id会自动生成,也可以手动指定_id,比如用手机号做主键:

{‘_id‘ : ‘+86186*****‘, name: ‘‘ }

_rev是其版本号,每更新一次 _rev就会自动发生变化,格式为

5-6a8617596d2adfea245662df0df611ao

,标识第5个版本,后面是HASH签名,可以通过_rev寻找到所有的历史版本,所以用来做需要存储版本的文档系统应该非常不错,比如多人协作修改一篇文档等应用。

CouchDB提供RESTful接口访问,只需要执行http请求就能完成增删改功能,好处是,只需要命令行cURL就可以开始工作了,不需要特别的驱动,比如:获取一篇文档:

curl -X GET http://127.0.0.1:5984/dbname/_id

就可以了,而坏处是,http协议的效率并不高,尤其是如果执行一个页面需要多个请求的时候,用MySQL可以公用一个打开的链接就可以不断执行查询,而用http?得想想怎么样让http复用一个socket链接,所以越是入门简单,后面的麻烦就越多!

CouchDB的查询功能非常弱,CouchDB如何执行查询呢?不同于MySQL,扔一条SQL过去就得了。得为每一次查询创建一个view,view的格式:

{"map": "function(doc){ emit( key,  value); } "}

,这里面的function必须是一个字符串,而不能是javascript的合法语句,所以你写一个稍微复杂一点的语句,得先保证在node/console里调试好,然后把他转换成字符串,然后再构造出合法的json字符串post过去,这个过程非常的痛苦。而且这个view在第一次查询的时候速度会慢的吓死人,40万条数据,执行一次需要的时间大概要5分钟左右,400万条,我就不敢测试了,但stackoverflow上有网友说他跑了4个小时还没跑出结果来,因为这个map可不存在什么优化的地方,map就是一条条在运行,所以不管做什么查询,都要遍历所有doc,能不慢么!

另外,view其实也是像其他普通的记录一样实实在在存在数据库里的,可以通过 _utils 看到,view中是不可以传递变量的(临时view可以),比如在一个库里存在 member 数据有 name, email, city等,需要查询 city为"shenzhen"的member,那么怎么办?第一用临时view: temp_view,构造动态的查询map语句:

curl http://127.0.0.1:5984/dbname/_temp_view?include_docs=true -H ‘Content-Type: application/json‘  -d ‘{"map": "function(doc){  if(doc.city.match(/shenzhen/) ) emit(doc._id, 1 );  }" }‘

最好把这个 _temp_view 存储成永久的view,否则每次查询一个新的city都会很慢的,一旦执行过一次查询,后面的访问就会比较快,但是前提是:得执行过一次查询!

但如果存储为永久view,就需要写死 shenzhen这个字符串在view中,这种传递变量的办法显然是不可取的,非常呆板,难道我要查询一个 city为 shenzhen的就得新建一个 view,那么全国那么多city,是不是每一个都要新建一个city?view这种方式查询真的很愚蠢!

除了temp_view外,到底有没有办法可以动态传递参数的?可以啊 startkey 和 endkey啊,但这两个参数光从名字就可以看出设计的是多么愚蠢了。

好这样查询,先创建一个view,保存为 member/city_query

‘{"map": "function(doc){  emit([doc.city, doc._id],   1 );  }" }‘

接下来就可以痛快查询啦:

curl http://127.0.0.1:5984/dbname/_design/member/_view/city_query?startkey=[shenzhen]&endkey=[shenzhen]
-H ‘Content-Type: application/json‘

这个语句是不能运行的,需要手动将中括号 [] 转义。看就是这么无聊。

执行的过程是这样的:startkey传递了一个数组参数,只有一个值 shenzhen,在view的map里,emit不再是一个普通的key,而是一个数组,startkey第一个值对应于emit的第一个参数中的第一位即 doc.city, 结果就会检索 city的值>=shenzhen,再指定一个endkey就OK了啊!可以想想,这个map还是会遍历所有的记录!

这样的设计的很低级,而且非常不好用,如果我要查询 正则匹配怎么办?老老实实创建一个新的view? 结果就是如果你的查询比较多样化,里面的view可能比数据还多!

最终我的结论是,不要在大数据上尝试CouchDB,不要在需要频繁查询的地方使用CouchDB,不要在需要大量汇总、分析数据的地方使用CouchDB,他只适合最多几千条数据的小博客、小文档系统,并且不需要各种花式查询的地方,他的性能不如想想中来的那么畅快,而且CouchDB内部存储就是实实在在的文件而已,没有什么优化,提升查询速度也不是CouchDB最近的目标,他们更多关注在功能上而非性能。并且CouchDB的开发初衷是Apache基金会的一厢情愿,并非工程需求,所以如果选择NoSQL,要尽可能找在工程需求中开发出来的数据库。

时间: 2024-10-13 03:22:16

CouchDB用起来可能不是很舒服的相关文章

同分异构还有发规划法规和发很舒服56757

http://www.buildhr.com/so/?wordtype=2&searchword=18817309865%E6%B8%A9%E5%B7%9E%E9%B9%BF%E5%9F%8E%E6%89%BE%E7%BE%8E%E5%A5%B3%E5%B0%91%E5%A6%87%E5%B0%8F%E5%A7%90%E4%B8%8A%E9%96%80%E7%89%B9%E6%AE%8A%E6%9C%8D%E5%8B%99 http://www.buildhr.com/so/?wordtype=

android:eclipse看着很舒服的字体和启动速度很快android模拟器

找了很久才找到这个字体 点击下载 下载后 在c盘windows/font文件夹下添加解压后的字体即可  然后重启eclipse  依次打开preference->General->appearance->Colors and Fonts-->Basic->Text Font->Edit 找到YaHei Consolas Hybrid 即可 如下: 感觉比以前看着舒服多了 还有eclipse的模拟器 启动慢  部署app的时候也慢 大家可以百度搜索genymotion官网

王石 你没有变强是因为你一直很舒服

职业生涯很长,对企业而言,它需要你成为一个专才,但从职业发展来看,你需要成为一个全才,方能适应社会的变化.阻碍你成为全才的不良习惯有很多,有时候我们喜欢趋利避害,拖延症更是让自己定下来的目标难以实现.从现在起,你要努力去寻找各种让自己变得不舒服的环境.习惯,别害怕痛苦,伴随着痛苦的出现,才会有成长的空间.新的一年让自己变得更强,王石告诉你五个变得更强的生活习惯. 这个世界上有两种人,一种人是强者,一种人是弱者.强者给自己找不适,弱者给自己找舒适.想要变得更强,就必须要学会强者的必备技能,那就是让

你没有变强,是因为你一直很舒服

王石 当要对自己做出改变,比如学习.健身.时间管理--的时候,由于要打破以前的禁锢开始养成一个新的思维方式或习惯,难免会有些不适应甚至痛苦,一旦稍微不注意就会选择放弃.那么,针对这个情况,该如何是好?今天分享一篇王石的文章,希望对你有所启发. 这个世界上有两种人,一种人是强者,一种人是弱者.强者给自己找不适,弱者给自己找舒适.想要变得更强,就必须要学会强者的必备技能,那就是让不适变得舒适. 如果你学会了这种技能,你可以搞定很多事情,例如克服拖延,健身,学习新语言,探索未知领域等等.但是很多人都倾

8个让人很舒服的沟通技巧

时间:2015-04-20 11:13 来源:网络 作者:佚名 1.赞美行为而非个人 举例来说,如果对方是厨师,千万不要说:你真是了不起的厨师.他心里知道有更多厨师比他还优秀.但如果你告诉他,你一星期有一半的时间会到他的餐厅吃饭,这就是非常高明的恭维. 2.客套话也要说得恰到好处 客气话是表示你的恭敬和感激,所以要适可而止. 如果对方是经由他人间接听到你的称赞,比你直接告诉本人更多了一份惊喜.相反地,如果是批评对方,千万不要透过第三者告诉当事人,避免加油添醋. 3.面对别人的称赞,说声谢谢就好

萌新xpath的爬虫,用着很舒服

我用的是Pycharm编辑器,3.5的python.br/>首先给大家看看源码与成果#####@Time:2018/10/25#####@Author:DQimport requestsfrom lxml import etreeheaders = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1 Trident/5.0;"}html = requests.get("

百度很舒服就撒谎发生就开了房间爱思考了几分拉伸

http://www.ebay.com/cln/r_cn536/-/167611336011/2015_02_05 http://www.ebay.com/cln/koqhua_d1dylpw/-/167424289018/2015_02_05 http://www.ebay.com/cln/wexnj-5829/-/167577259016/2015_02_05 http://www.ebay.com/cln/lcn7019/-/167446568014/2015_02_05 http://w

百度施工方就很舒服考虑时间

http://www.ebay.com/cln/q.q9701/book/167508956016/20150205 http://www.ebay.com/cln/jshe050/book/167374695014/20150205 http://www.ebay.com/cln/jrn_din/book/167302538017/20150205 http://www.ebay.com/cln/zagon10/book/167508964016/20150205 http://www.eba

百度换房间卡很舒服哈舒服家里撒娇法拉利;

http://www.ebay.com/cln/nitan26/book/167522914011/20150202 http://www.ebay.com/cln/chafan-7zfqee/book/167522913011/20150202 http://www.ebay.com/cln/yoy2297/book/167491872016/20150202 http://www.ebay.com/cln/l.xi411/book/167181543019/20150202 http://w