Node.js 使用CouchDB进行非常慢的插入?

Node.js 使用CouchDB进行非常慢的插入?,node.js,couchdb,couchdb-nano,Node.js,Couchdb,Couchdb Nano,我想看看与MySQL相比CouchDB可以处理多少插入。我的测试很简单:持续插入{firstName:“Testing 001”,lastName:“Testing 002”}10秒钟,然后比较文档/行的数量。我得到的结果与我的期望相差甚远: MySQL MyIsam:110000行 MySQL InnoDB:52000行 CouchDB:3300文档 如果我错了,请纠正我,但NoSQL在简单操作中是否应该总是优于关系数据库?我没想到会有这么大的不同。也许我的测试很幼稚,我不应该以这种方式比

我想看看与MySQL相比CouchDB可以处理多少插入。我的测试很简单:持续插入
{firstName:“Testing 001”,lastName:“Testing 002”}
10秒钟,然后比较文档/行的数量。我得到的结果与我的期望相差甚远:

  • MySQL MyIsam:110000行
  • MySQL InnoDB:52000行
  • CouchDB:3300文档
如果我错了,请纠正我,但NoSQL在简单操作中是否应该总是优于关系数据库?我没想到会有这么大的不同。也许我的测试很幼稚,我不应该以这种方式比较这些数据库?我知道MySQL驱动程序可以访问连接池,并且不必在每次请求时都重新创建TCP连接,但它会带来如此大的差异吗

CouchDB insert是否应该如此缓慢?如果不是,如何正确操作

我在一个干净的CouchDB数据库(没有任何设计文档)/MacBookPro 2.6Ghz i7、16GB RAM、SSD/CouchDB 1.4.0上运行测试

测试脚本:

var nano = require('nano')('http://localhost:5984');
var async = require('async');
var db = nano.db.use('test');
var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '',
  database: 'test'
});

/*
connection.connect(function(err){
    var t = new Date().getTime() + 10000;
    var i = 0;

    var page = 2,
        lastPage = 100;

    async.whilst(function () {
      return new Date().getTime()  < t;
    },
    function (next) {
        connection.query('INSERT INTO test (firstName, lastName) VALUES ("Testing 001","Testing 002")', function(err, rows, fields) {
          i += 1;
          next();
        });
    },
    function (err) {
        console.log( i );
        connection.end();
    });
});
*/

var t = new Date().getTime() + 10000;
var i = 0;

var page = 2,
    lastPage = 100;

async.whilst(function () {
  return new Date().getTime()  < t;
},
function (next) {
  db.insert({firstName: "Testing 001", lastName: "Testing 002"}, 'id-' + i, function(){
    i += 1;
    next();
  });
},
function (err) {
    console.log( i );
    connection.end();
});
var nano=require('nano')('http://localhost:5984');
var async=require('async');
var db=nano.db.use('test');
var mysql=require('mysql');
var connection=mysql.createConnection({
主机:“localhost”,
用户:'根',
密码:“”,
数据库:“测试”
});
/*
connection.connect(函数(err){
var t=new Date().getTime()+10000;
var i=0;
变量页=2,
最后一页=100;
async.while(函数(){
返回新日期().getTime()
//编辑:

事实证明,问题并不在CouchDB方面。客户机的库/驱动程序有些地方让它们速度非常慢。使用apache benchmark进行的简单后测试在CouchDB端显示了非常好的结果:

$ ab -n 10000 -c 100 -p post-data -T "application/json" "http://192.168.50.102:5984/test/"
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.50.102 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        CouchDB/1.5.0
Server Hostname:        192.168.50.102
Server Port:            5984

Document Path:          /test/
Document Length:        95 bytes

Concurrency Level:      100
Time taken for tests:   1.149 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      4120412 bytes
Total POSTed:           1920960
HTML transferred:       950095 bytes
Requests per second:    8704.85 [#/sec] (mean)
Time per request:       11.488 [ms] (mean)
Time per request:       0.115 [ms] (mean, across all concurrent requests)
Transfer rate:          3502.69 [Kbytes/sec] received
                        1632.98 kb/s sent
                        5135.67 kb/s total

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       2
Processing:     6   11   2.6     11      23
Waiting:        6   11   2.6     11      22
Total:          6   11   2.6     11      25
$ab-n 10000-c 100-p post data-T“application/json”http://192.168.50.102:5984/test/"
这是ApacheBench,版本2.3
版权1996亚当·特维斯,宙斯科技有限公司,http://www.zeustech.net/
授权给Apache软件基金会,http://www.apache.org/
基准192.168.50.102(耐心等待)
完成了1000个请求
已完成2000项请求
已完成3000个请求
已完成4000个请求
已完成5000个请求
已完成6000个请求
已完成7000个请求
已完成8000个请求
已完成9000个请求
已完成10000个请求
完成了10000个请求
服务器软件:CouchDB/1.5.0
服务器主机名:192.168.50.102
服务器端口:5984
文档路径:/test/
文件长度:95字节
并发级别:100
测试时间:1.149秒
完成申请:10000
失败的请求:0
写入错误:0
传输总量:4120412字节
过帐总数:1920960
传输的HTML:950095字节
每秒请求数:8704.85[#秒](平均值)
每次请求的时间:11.488[ms](平均值)
每个请求的时间:0.115[ms](所有并发请求的平均时间)
传输速率:接收到3502.69[千字节/秒]
发送1632.98 kb/s
总计5135.67 kb/s
连接时间(毫秒)
最小平均值[+/-sd]最大中值
连接:0.1 0 2
处理:6112.61123
等候时间:61122.61122
总数:6112.61125

是否一次插入一个文档?您肯定应该使用批量文档加载功能进行现实的比较:

在此处阅读有关CouchDB性能的更多信息:


(有点过时,但大部分仍然相关)

是否一次插入一个文档?您肯定应该使用批量文档加载功能进行现实的比较:

在此处阅读有关CouchDB性能的更多信息:


(有点过时,但大部分仍然相关)

是的,我做单次插入。使用BULKs是一个很好的观点,但是MySQL也可以使用bulk。在我试图模拟的真实场景中,所有插入都是独立的。GET/SELECT查询也有同样大的区别。我不确定是否应该归咎于HTTP协议或CouchDB。是的,我只做一次插入。使用BULKs是一个很好的观点,但是MySQL也可以使用bulk。在我试图模拟的真实场景中,所有插入都是独立的。GET/SELECT查询也有同样大的区别。我不确定是否应该归咎于HTTP协议或CouchDB,比如说,“NoSql比RDBMS快”并不是普遍正确的。DBs既有优势也有劣势,这可能就是其中之一。这种类型的测试的问题是,它可能会突出缺点,但不会显示CouchDb可能在哪些方面表现优异。如果您试图强制或强制NoSql DB像RDBMS一样运行,结果往往好坏参半。我同意,尽管我喜欢了解其优缺点。我认为对于任何系统来说,简单的插入/选择都不应该是一个大挑战。这就是为什么我对结果如此困惑的原因。写操作通常是数据库系统中最昂贵的操作。我想我应该将测试切换为实际异步,以便一次允许多个连接/插入。“NoSql比RDBMS快”并不是普遍正确的。星展银行既有优势也有劣势