nodejs + postgresql方式太慢

Fer*_*sso 3 postgresql node.js

我有这段代码:

var pg = require('pg');
var QueryStream = require('pg-query-stream');
var constr = 'postgres://devel:1234@127.0.0.1/tcc';
var JSONStream = require('JSONStream');
var http = require('http');

pg.connect(constr, function(err, client, done) {
    if (err) {
        console.log('Erro ao conectar cliente.', err);
        process.exit(1);
    }

    sql = 'SELECT \
          pessoa.cod, \
          pessoa.nome, \
          pessoa.nasc, \
          cidade.nome AS cidade \
          FROM pessoa, cidade \
          WHERE cidade.cod IN (1, 2, 3);';

    http.createServer(function (req, resp) {
        resp.writeHead(200, { 'Content-Type': 'text/html; Charset=UTF-8' });
        var query = new QueryStream(sql);
        var stream = client.query(query);

        //stream.on('data', console.log);
        stream.on('end', function() {
            //done();
            resp.end()
        });
        stream.pipe(JSONStream.stringify()).pipe(resp);
    }).listen(8080, 'localhost');
});
Run Code Online (Sandbox Code Playgroud)

当我在上面运行apache bench时,每秒只能收到大约四个请求。如果我在php / apache或java / tomcat中运行相同的查询,我得到的结果快十倍。该数据库有1000行。如果我将查询限制为大约十行,那么node比php / java快一倍。

我究竟做错了什么?

编辑:前段时间我在这里打开了一个问题:https : //github.com/brianc/node-postgres/issues/653

我之所以提供此链接,是因为我在此处尝试过的代码上发布了一些其他变体。到目前为止,即使有评论和提示,我也无法获得下降的速度。

dno*_*zay 5

  • pg-query-stream 使用游标。
  • 它使用光标(粗体为强调)。
  • 您可以阅读代码并进行更改batchSize以更好地满足您的需求。

对于那些不知道游标是什么的人,简而言之,它们是权衡的选择,以保持较小的内存占用并且不读取内存中的整个表。但是,如果在获得结果100的同时获得行1000,那就是1000 / 100往返。因此可能10x比不使用游标的解决方案要慢。

如果知道需要多少行,limit请在查询中添加,然后更改每次返回的行数,以最大程度地减少往返次数。

  • 您误以为无礼/讽刺;但我调整了答案。 (2认同)