在最短的时间内从数据库中获取数据

时间:2014-04-30 11:41:15

标签: javascript mysql node.js performance

我使用的是mysql和node.js.我有一个按钮'加载之前的聊天'加载两个用户的聊天。 当我点击那个按钮时,它会给出结果@ 12行/秒(手动测试)。我怎样才能让它快速? 这是我的代码

在服务器端 -

socket.on('chatHistory', function(data){
    var count=0;
    connection.query("SELECT * FROM chatRecord WHERE uniqueRoomId = '"+data.roomId+"' ", function(err, result, fields) {
        if (err) throw err;


        for (var j in result) 
        {
            if (rows3.hasOwnProperty(j)) count++;
        }
        var k=0;
        if(result[0])
        {
            socket.emit('chatHistoryMaintain', {result:result,sum:count,nickname:data.nickname});
        }
    });
    });

客户端代码 -

socket.on('chatHistoryMaintain', function(data){
    for(i=0;i<data.sum;i++)
    {
        if(data.result[i].sender==data.nickname) 
        {
          $('#chat-messages ul').append('<li class="marker"><div class="fl sender">'+nickname+' : </div><div class="fl text1">'+data.result[i].msg+'</div></li>');
        }
        else 
        {
          $('#chat-messages ul').append('<li class="marker"><div class="fl receiver">'+nickname+' : </div><div class="fl text">'+data.result[i].msg+'</div></li>');
        }
     }
});

我如何优化它,因为我的应用程序提供@ 12行/秒的结果而Skype的速度高达1560行/秒?我做错了什么?

以下是我的数据库引擎的详细信息

>     +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
>     | Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
>     +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
>     | PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
>     | MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
>     | MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
>     | BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO      
> |
>     | MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
>     | CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
>     | ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
>     | FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
>     | InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
>     +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

1 个答案:

答案 0 :(得分:1)

为了使速度更快,首先必须找出为什么它在第一时间变慢

  1. 使用EXPLAIN查看您的查询是在进行行扫描还是使用索引和哪些索引。
  2. 如果您感觉被EXPLAIN输出所骚扰,请尝试使用相同的SELECT COUNT(*)...子句执行WHERE。如果它也很慢,索引可能就是问题。
  3. 检查从cli客户端执行查询是否也很慢
  4. 如果问题出在查询中进行行扫描,请调整索引。如果mysql找到数据没有问题,而是返回它,不要等待所有30k记录通过套接字泵送,以便一次性返回它们。考虑使用行的异步提取(毕竟是它的node.js!),如official doc中所述。在node.js进程内存中放入大量记录不是一个好主意,您可以尝试监视进程的内存使用情况。