在最短的时间内从数据库中提取数据
fetch data from database in minimal time
我使用的是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 |
> +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
为了让它更快,你必须首先找出为什么慢
- 使用EXPLAIN可以了解查询是在执行行扫描还是在使用索引以及使用哪些索引
- 若您觉得EXPLAIN输出很麻烦,请尝试使用相同的
WHERE
子句执行SELECT COUNT(*)...
。如果它也很慢,那么指数可能就是问题所在 - 检查从cli客户端执行查询是否也那么慢
如果问题出在执行行扫描的查询中,请调整索引。如果mysql在查找数据但返回数据时没有问题,那么不要等到所有30k条记录都通过socket泵送,然后一批返回。考虑使用异步获取行(毕竟是node.js!(,如官方文档中所述。同时在node.js进程内存中放入大量记录不是一个好主意,您可以尝试监控进程的内存使用情况。
相关文章:
- 如何从重定向的支付处理器网站提取交易详细信息并保存到我的rails 4数据库
- 使用javascript、jquery和PHP自动完成从数据库中提取城市的输入
- React组件从Flux存储中呈现数据,但从Mongo数据库中提取数据时不呈现
- 如何获得要渲染的字符实体(PHP从数据库中提取以在Fullcalendar中显示)
- 如何将从数据库中提取的数字传递到javascript数据部分
- 单击时从数据库中提取数据
- 什么可能导致 MVC 应用在从数据库中提取后无法在 IE 中显示当前信息
- Chrome扩展程序:在后台提取数据并存储在数据库中
- 将事件从数据库提取到完整日历中
- 如何从我的 MySQL 数据库中提取数据以在页面加载时预填充表单
- 从 API 中提取信息并将其添加到数据库(平均堆栈)
- Ajax,PHP,Javascript在组合框选择后从数据库中提取值
- 从字符串中提取信息并将其保存到数据库
- 如何使用PHP从数据库中提取数据并将其传递给Javascript
- 以ng重复从数据库中提取的项目的相反顺序
- googlemapsv3切换从SQL数据库提取的标记的可拖动属性
- 需要帮助自动建议显示(以列表形式)从数据库中提取/匹配的数据
- 需要使用Java脚本从数据库中提取算术和逻辑运算符
- 用Javascript自动创建从数据库中提取的对象
- 使用PEAR从数据库提取的Excel文件中的前导零