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與秒鐘相同的請求快得多?
大概緩存... – Namphibian
嗯,我懷疑Knex是因爲緩存我做ORDER BY RAND(),使每個請求不同的結果。我明白爲什麼每個查詢的第一個查詢需要更長的時間,這是因爲MySQL在第一個請求後緩存了數據,但是如果它是MySQL緩存,兩個庫都將受益,除非Sequelize強制MySQL不使用緩存,不知道這是否是可能的和B,這沒有什麼好的理由。 – ryanzec