2013-07-31 49 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

回答