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

fetch data from database in minimal time

本文关键字:数据库 提取 数据 时间      更新时间:2023-09-26

我使用的是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. 使用EXPLAIN可以了解查询是在执行行扫描还是在使用索引以及使用哪些索引
  2. 若您觉得EXPLAIN输出很麻烦,请尝试使用相同的WHERE子句执行SELECT COUNT(*)...。如果它也很慢,那么指数可能就是问题所在
  3. 检查从cli客户端执行查询是否也那么慢

如果问题出在执行行扫描的查询中,请调整索引。如果mysql在查找数据但返回数据时没有问题,那么不要等到所有30k条记录都通过socket泵送,然后一批返回。考虑使用异步获取行(毕竟是node.js!(,如官方文档中所述。同时在node.js进程内存中放入大量记录不是一个好主意,您可以尝试监控进程的内存使用情况。