高效的 SQL 表合并和分页
Posted
技术标签:
【中文标题】高效的 SQL 表合并和分页【英文标题】:Efficient SQL table merge and paginate 【发布时间】:2020-01-17 16:07:57 【问题描述】:我有 5 个不同的表,即:
存款 提款 付款 转移 交流我需要合并这些表并从Nodejs
API 返回一个分页结果给客户端。我不知道如何有效地做到这一点,因为这些表真的很大(每个 > 100K 行)。
我正在考虑两种我可以采取的方法。
-
将每个表中的单个查询结果流式传输到节点 js 后端,并在那里实现一些合并逻辑。
或
-
以某种方式在数据库级别执行合并,方法是创建某种虚拟表或某些持久视图,然后对其执行查询。
你们觉得呢?
感谢您的宝贵时间!
【问题讨论】:
请显示这些表格的结构,以便我们能够更准确地提供帮助。一般来说,我会说,使用数据库做某事的最高效方式是在数据库上,例如带有视图或带有有效连接的准备好的语句。 在数据库中,是否有一个通用的“事务”表(如果没有,我会感到惊讶)?如果是这样,为什么不从中进行分页呢? 你用的是什么数据库? 有很多方法可以做到这一点,比如非规范化表格。您需要提供有关您的基础架构、数据库、索引以及您希望运行的查询等的更多信息... 出于什么目的需要这些表中的数据?是报告吗?您要根据这些记录进行计算吗? 【参考方案1】:如果您打算使用 DB 数据进行操作,那么从我的角度来看,最有效的方法是在 DB 级别上,通过 JOIN、UNION 或 Sub queries。如上所述,假设 Node.js 流式传输 concept,对大型数据集采用流式传输始终是一种好习惯。
const request = new sql.Request()
request.stream = true // You can set streaming differently for each request
request.query('select * from verylargetable')
如果您希望将此数据进一步用于其他一些客户端应用程序,您可以考虑使用CSV stringifier Node.js 包,将 SQL 输出数据转换为 CSV 文本格式。
【讨论】:
【参考方案2】:在不了解表结构的情况下很难提供解决方案。您可以使用通过 INNER JOIN 创建的视图,并使用该视图选择属性以将数据返回给 API 请求,或者您可以直接使用 INNER JOIN 来返回数据。使用过程返回数据。
【讨论】:
以上是关于高效的 SQL 表合并和分页的主要内容,如果未能解决你的问题,请参考以下文章