每个数据库行发出一次socket.io性能

aba*_*rik 2 mysql node.js socket.io

我试图了解什么是读取和发送大量数据库行(50K-100K)到客户端的最佳方法.

  1. 我应该只是从后端的数据库中读取所有行,然后以json格式发送所有行吗?由于用户只是等待了很长时间,因此响应速度不是很快,但对于小编号而言,这个速度更快.的行.

  2. 我应该从数据库中流式传输行,每次从数据库中读取行时,我都会调用socket.emit()吗?这导致套接字发出太多,但响应速度更快,但速度慢......

我正在使用node.js,socket.io

jfr*_*d00 7

重新思考界面

首先,在客户端上显示50-100k行的用户界面设计可能不是最好的用户界面.不仅是大量数据要发送到客户端和客户端管理,在某些移动设备中可能不切实际,但显然比任何单个用户在任何给定的交互中实际读取的行数更多.这页纸.因此,第一个顺序可能是重新考虑用户界面设计并创建某种更多需求驱动的界面(分页,虚拟滚动,按字母键等).对于不同(并且希望更好)的用户界面设计,存在许多不同的可能性,这减少了数据传输量.哪种设计最好取决于数据和用户可能的使用模型.

以块为单位发送数据

也就是说,如果您要将大量数据传输到客户端,那么您可能希望以块(一次一组的行)的形式发送它.使用块的想法是您在一个块中发送可消耗数量的数据,以便客户端可以解析它,处理它,显示结果然后为下一个块做好准备.客户端可以一直保持活动状态,因为它在块之间有可用的周期来处理其他用户事件.但是,以块的形式发送它可以减少为每一行发送单独消息的开销.如果您的服务器使用压缩,那么块也可以提高压缩效率.块应该有多大(例如,应该包含多少行数据)取决于一系列因素,并且可能最好通过对可能的客户端或最低功率预期客户端的实验来确定.例如,您可能希望每封邮件发送100行.

为数据使用高效传输格式

而且,如果您使用socket.io传输大量数据,则可能需要重新审视如何使用JSON格式.例如,发送所有重复完全相同属性名称的100,000个对象效率不高.您通常可以创建自己的优化,避免重复在每个对象中完全相同的属性名称.例如,而不是发送100,000个这样的:

 {"firstname": "John", "lastname": "Bundy", "state": "Az", "country": "US"}
Run Code Online (Sandbox Code Playgroud)

如果每个对象具有完全相同的属性,那么您可以将属性名称编码到您自己的代码中,或者发送属性名称一次,然后只需在接收代码可以放入对象的数组中发送逗号分隔的值列表使用适当的属性名称:

 ["John", "Bundy", "Az", "US"]
Run Code Online (Sandbox Code Playgroud)

通过简单地删除冗余信息,数据大小有时可以减少2-3倍.