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

Mysql socket.io性能每个数据库行发出一个,mysql,node.js,socket.io,Mysql,Node.js,Socket.io,我试图了解读取和发送大量数据库行(50K-100K)到客户端的最佳方式 我是否应该在后端一次从数据库中读取所有行,然后以json格式发送所有行?由于用户只是等待了很长时间,所以响应速度不是很快,但对于少量行,响应速度更快 我是否应该从数据库中流式传输行,并且在每次从数据库中读取行时,调用socket.emit()?这会导致太多套接字发射,但响应速度更快,但速度较慢 我正在使用node.js、socket.io重新思考界面 首先,在客户机上显示50-100k行的用户界面设计可能不是最好的用户界面。

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

  • 我是否应该在后端一次从数据库中读取所有行,然后以json格式发送所有行?由于用户只是等待了很长时间,所以响应速度不是很快,但对于少量行,响应速度更快

  • 我是否应该从数据库中流式传输行,并且在每次从数据库中读取行时,调用socket.emit()?这会导致太多套接字发射,但响应速度更快,但速度较慢


  • 我正在使用node.js、socket.io重新思考界面

    首先,在客户机上显示50-100k行的用户界面设计可能不是最好的用户界面。这不仅是因为需要向客户端发送大量数据并由客户端进行管理,而且在某些移动设备中可能是不切实际的,而且在与页面的任何给定交互中,显然要比任何单个用户实际读取的行数多得多。因此,第一步可能是重新考虑用户界面设计,创建某种更受需求驱动的界面(分页、虚拟滚动、字母键等)。有许多不同的可能性可以使用不同的(希望更好的)用户界面设计来减少数据传输量。哪种设计最好完全取决于数据和用户可能的使用模型

    分块发送数据

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

    对数据使用有效的传输格式

    而且,如果您使用socket.io传输大量数据,您可能需要重新了解如何使用JSON格式。例如,发送100000个重复完全相同属性名称的对象不是很有效。您通常可以发明自己的优化,以避免重复每个对象中完全相同的属性名称。例如,与其发送100000份,不如发送:

     {"firstname": "John", "lastname": "Bundy", "state": "Az", "country": "US"}
    
    如果每个对象都具有完全相同的属性,则可以将属性名称编码到自己的代码中,也可以发送一次属性名称,然后只发送一个以逗号分隔的数组中的值列表,接收代码可以将该列表放入具有适当属性名称的对象中:

     ["John", "Bundy", "Az", "US"]
    

    有时,只需删除冗余信息,数据大小就可以减少2-3倍。

    为什么需要一次发送这么多数据?您看过服务器端分页吗?一旦您了解了如何以“响应式”方式显示100k行数据,您可以按照@BenFortune的建议发送分页数据,例如,选择前50个结果并将其发送给客户端,当他们想查看更多结果时,在接下来的50个结果中重复上述步骤。我一次需要所有数据,因为我给了用户这个选项。我已经研究了服务器端分页,但它在我的情况下不起作用,因为我需要在前端处理10万行(以分组方式显示它们),但这东西没有压缩吗?与此类似,压缩将删除与重复压缩相关的所有大小keys@Rambatino-socket.io开箱即用不做压缩(它只是WebSocket上的一层)。有一些npm模块可以添加压缩。我对他们没有任何经验。一开始就不发送冗余数据是很难克服的,但是如果你喜欢的话,还有压缩选项。压缩真正属于webSocket层,对此有一些建议,但我没有看到任何标准化的内容。看这个,谢谢你,伙计!我想这最终是一个折衷压缩和解压缩之间的时间相比,它会采取不压缩。对于小数据(哪些套接字应该处理),这意味着它不太值得压缩