我试图了解读取和向客户端发送大量数据库行(50K-100K)的最佳方法是什么。
我应该简单地从后端的数据库中读取所有行,然后以json格式发送所有行吗?由于用户只是等待了很长时间,因此响应速度不是很快,但对于小编号而言,这个速度更快。行。
我应该从数据库中流式传输行,每次从数据库中读取行时,都会调用socket.emit()吗?这会导致套接字发出太多,但响应速度更快,但速度很慢......
我正在使用node.js,socket.io
答案 0 :(得分:6)
重新考虑界面
首先,在客户端上显示50-100k行的用户界面设计可能不是最好的用户界面。不仅是大量数据要发送到客户端和客户端管理,在某些移动设备中可能不切实际,但显然比任何单个用户在任何给定的交互中实际读取的行数更多。这页纸。因此,第一个顺序可能是重新考虑用户界面设计并创建某种更多需求驱动的界面(分页,虚拟滚动,按字母键等)。对于不同(并且希望更好)的用户界面设计,存在许多不同的可能性,这减少了数据传输量。哪种设计最好取决于数据和用户可能的使用模型。
以大块发送数据
也就是说,如果您要将那么多数据传输到客户端,那么您可能希望以块(一次一组的行)的形式发送它。使用块的想法是您在一个块中发送可消耗数量的数据,以便客户端可以解析它,处理它,显示结果然后为下一个块做好准备。客户端可以一直保持活动状态,因为它在块之间具有可用于处理其他用户事件的周期。但是,以块的形式发送它可以减少为每一行发送单独消息的开销。如果您的服务器使用压缩,那么块也可以提高压缩效率。块的大小应该是多少(例如,应该包含多少行数据)取决于一系列因素,并且可能最好通过对可能的客户端或最低功率预期客户端的实验来确定。例如,您可能希望每封邮件发送100行。
为数据使用高效传输格式
而且,如果您使用socket.io传输大量数据,您可能需要重新审视如何使用JSON格式。例如,发送所有重复完全相同属性名称的100,000个对象效率不高。您通常可以创建自己的优化,避免重复在每个对象中完全相同的属性名称。例如,而不是发送100,000个这些:
{"firstname": "John", "lastname": "Bundy", "state": "Az", "country": "US"}
如果每个对象具有完全相同的属性,那么您可以将属性名称编码到您自己的代码中,或者发送属性名称一次,然后只需在接收代码可以放入的数组中发送逗号分隔的值列表到具有适当属性名称的对象:
["John", "Bundy", "Az", "US"]
通过简单地删除冗余信息,数据大小有时可以减少2-3倍。