Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Node.js中的MySQL这么慢?_Mysql_Node.js_Node Mysql - Fatal编程技术网

为什么Node.js中的MySQL这么慢?

为什么Node.js中的MySQL这么慢?,mysql,node.js,node-mysql,Mysql,Node.js,Node Mysql,我的Node.js代码如下 代码1:下文 var http=require('http'); var MySQL = require('mysql'); mysql = MySQL.createConnection(...) http.createServer(function(req, res){ // the query will take several seconds mysql.query("SELECT SLEEP(1)", function....) }); h

我的Node.js代码如下

代码1:下文

var http=require('http');
var MySQL = require('mysql');

mysql = MySQL.createConnection(...)

http.createServer(function(req, res){
    // the query will take several seconds
    mysql.query("SELECT SLEEP(1)", function....)
});
http.listen(...);
问题是当我刷新页面太快时,服务器将崩溃。我认为是节点mysql模块的问题,它在队列中处理查询。所以我尝试创建一个连接池

代码2:如下

....
var pool = require('generic-pool');
var mp   = pool.Pool({
    ...
    create: function(cb){
        client = MySQL.createConnection(...);
        cb(null, client)
    },
    max: 10, // up to 10 connection
    min: 2,
    ...
});
....
    mp.acquire(function(err, mysql){

        // the query will take several seconds
        mysql.query("SELECT SLEEP(1)", function....)
        mp.release(mysql);
    });
....
但问题仍然存在,为什么?我怎样才能解决这个问题


编辑:我启动100个请求,100个并发,预计10秒。但是需要20秒。为什么?连接池最多只能支持5个连接吗?

连接池是处理多个并发请求的一个很好的解决方案。 但是,我们为什么不能使用mysql特定的池,而不是使用“通用资源池”


这里讲的是“节点mysql池”,这是node.js的mysql连接池。免责声明:我编写这个模块是为了解决这种问题

npm install mysql-simple-pool
现在您可以配置连接池了。我最多使用100个连接

var Pool = require('mysql-simple-pool');
var pool = new Pool(100, {
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'test'
});
现在,您可以编写一个测试函数来对其进行测试

function test() {
    var counter = 0;
    var start = new Date().getTime();
    for (var xa = 0; xa < 10; xa++) {
        pool.query('SELECT SLEEP(1)', function(err, results) {
            counter++;
            if (counter == 10) {
                var end = new Date().getTime();
                console.log('Time spend is ' + (end - start) + 'ms');
                test();
            }
        });
    }
}
test();

第一次在它周围花费一些时间建立连接。希望这有帮助~

问题是什么?它是否有适当的索引支持?您需要发布更多的伪代码才能获得帮助。当您在命令行而不是通过节点运行查询时,需要多长时间?谢谢大家的帮助。20秒后,我运行了一个包含100个并发请求的查询。我知道这需要10秒。但实际上需要20秒。我不知道为什么?我已经将最大连接数设置为10,它将有10个mysql连接备用,QPS必须为10。有人能告诉我为什么吗?你是如何创建这100个请求的?如果它有100个浏览器选项卡,那么每个选项卡都会触发2个请求(url+favicon),最好使用
节点mysql
createPool({})
函数来创建一个连接池
Time spend is 1044ms
Time spend is 1006ms
Time spend is 1005ms
Time spend is 1006ms
Time spend is 1007ms
Time spend is 1005ms
Time spend is 1005ms
Time spend is 1004ms
Time spend is 1005ms
Time spend is 1005ms