2013-07-31 98 views
1
慢很多

我有以下代码:Sequelize查询比Knex

var apiLogger = require(__dirname + '/../configurations/logger').api; 
var Knex = require('knex'); 
var microtime = require('microtime'); 
var Sequelize = require("sequelize"); 

database = new Sequelize('MYDATABASE', 'MYUSERNAME', 'MYPASSWORD', { 
    host: "MYHOST", 
    port: 3306, 
    dialect: 'mysql', 
    pool: { 
    maxConnections: 5, 
    maxIdleTime: 30 
    } 
}); 

Knex.Initialize({ 
    client: 'mysql', 
    connection: { 
    host  : 'MYHOST', 
    user  : 'MYUSERNAME', 
    password : 'MYPASSWORD', 
    database : 'MYDATABASE', 
    charset : 'utf8' 
    } 
}); 

exports.test = function(req, res){ 
    apiLogger.info('Request made to /api/test'); 

    var start = microtime.nowDouble(); 
    database.query('SELECT id, username FROM Users ORDER BY RAND() LIMIT 10').then(function(data) { 
    console.log('query time : ' + (microtime.nowDouble() - start)); 
    res.json(data); 
    }, function(data) { 
    res.json(data); 
    }); 
}; 

exports.test2 = function(req, res){ 
    apiLogger.info('Request made to /api/test2'); 

    var start = microtime.nowDouble(); 
    Knex.Raw('SELECT id, username FROM Users ORDER BY RAND() LIMIT 10').then(function(data) { 
    console.log('query time : ' + (microtime.nowDouble() - start)); 
    res.json(data); 
    }, function(data) { 
    res.json(data); 
    }); 
}; 

如果我执行在exports.test代码(的/api/test API调用)约5秒彼此分开,平均响应大约是430ms,这是Sequelize代码。

如果我运行exports.test2(和api调用/api/test2)5秒钟的代码,第一个电话是430ms,但之后的电话约为100ms,那就是Knex。

如果我运行exports.test代码小于第二彼此分开,我得到了100ms左右的响应时间,我应该提,并与exports.test2代码,我可以呼叫之间等待2-3分钟,仍然获得了100毫秒响应时间。

是否有某种配置我缺少Sequelize,导致它比Knex慢得多?为什么请求与Knex分开的时间要比Sequelize与秒钟相同的请求快得多?

+0

大概缓存... – Namphibian

+0

嗯,我怀疑Knex是因为缓存我做ORDER BY RAND(),使每个请求不同的结果。我明白为什么每个查询的第一个查询需要更长的时间,这是因为MySQL在第一个请求后缓存了数据,但是如果它是MySQL缓存,两个库都将受益,除非Sequelize强制MySQL不使用缓存,不知道这是否是可能的和B,这没有什么好的理由。 – ryanzec

回答