MySQL 中的数据流如何工作以及它是如何用 Node.js 实现的?
ITPUB【TG电报@duotebb】版权所有,禁止转载。
让我们讨论一下它在后台是如何工作的,以及这个流是如何在幕后工作的。
首先,Knex.js 是一个仅提供流接口的查询构建器,换句话说,他们在功能的顶部添加了另一层,以使其更容易被程序员使用,这就是为什么它很难知道它是如何使用的在 Knex.js 文档的幕后工作。
最初 Stream 功能来自 knex.js 依赖于 MySQL 的原始 MySQL-node 客户端包。MySQL 包确实在他们的文档中提供了关于它是如何工作的简要说明,你可以从MySQL 流中阅读它。
然而到目前为止我们已经解释过,不清楚它是原生的 MySQL 功能还是只有 node.js 才能实现的功能。
因此,让我们更深入地了解这部分是如何编码的,我们可以从那里获得线索。
Mysql for node.js 是一个开源包,所以你可以通过他们的GitHub 仓库访问它是如何制作的,经过一段时间的闲逛,你会从他们的实现中得到一些线索。
如果你查看代码依赖的这个文件,你会发现他们使用了一个名为“COM_QUERY”的 MySql 文本协议来完成这项工作,那么让我们更深入地研究一下这个协议的作用?
COM_QUERY (SELECT statement message parsing) 是 MySQL 通信 Text Protocols 的一种,让我们关注一下 Text Protocol 是什么意思,和 Binary Protocol 进行比较:
区别其实在于协议是面向数据结构还是面向文本字符串,例如,HTTP 是一种文本协议,即使它发送 jpeg 图像时,它也只是发送原始字节,而不是它们的文本编码。
所以基本上通过 MySQL 中的 Text 协议,我们可以在没有任何编码的情况下发送和接收数据,而 Com Query 的好处是我们可以解析文本以提取我们的需求。你可以在其官方文档
中获取 MySql 的通信协议列表和MySQL 文本协议列表。
回到 COM_QUERY,让我们深入了解它的工作原理:
步骤 1) 客户端命令或客户端:
COM_QUERY 用于向服务器发送立即执行的基于文本的查询,换句话说,当您提供此“Select *”并将其链接到 Stream 函数时,它将将此查询发送到服务器然后开始执行马上。
步骤 2) MySQL 服务器以 4 个可能的数据包响应
1-如果执行错误,如SQL语法错误,返回ERR包
2-如果执行成功,但是没有找到数据,返回OK包
3- 如果客户端执行 load data local infile 'filename' into table,返回 LOCAL_INFILE_REQUEST。
4- 如果返回结果集(意味着有一些数据),则交付的包是Resultset。
步骤 3) 让我们关注结果集
结果集意味着找到了数据,这意味着我们正在获取一系列数据包。
结果集是我们收到的两部分的组合,
首先是列定义,它通常包含有关列和数据类型和架构详细信息的信息。
其次是行,每一行都是一个数据包,我们将行作为数据包。
ResultSet响应包的结构如下:
1 - 第一个数据包:是列长度数据包。
2 - 后跟n个字段描述包,每个字段描述就是一个包,毕竟是字段信息描述,一个EOF包或者OK包会作为字段定义和数据(Row)之间的分隔符发送。然后是OK包被退回
3 - 接下来是行数据包,每行一个数据包,包括包头和消息体。
4 - 最后的结束数据包,也可能是 EOF 或 OK 数据包
简而言之,更一般地说,在执行 Com Query 之后……我们收到一个数据包序列,每个数据包都是一行。
因此,让我们关注 MySQL 包以及他们如何使用它,在提供字符串查询之后,他们将向服务器发送一个 com 查询......他们接收行数据包,并且对于每个数据包,他们解析它以提取行被获取,他们使用 Node.js 流立即将它们作为事件发出,然后你侦听“数据”以获取行。
好吧,那是很多理论上的解释 xD,但是现在我们更好地理解它是由于 MySql 协议而工作的。
使用其他数据库和语言的数据库数据流
至于数据库,我不确定有多少其他数据库支持这一点,但我的研究和游乐场只有 MySQL。
至于 Node.js 以外的其他语言,这只是使用 node.js 流模块更友好的东西......这也可以通过其他语言实现,我已经看到 Java 示例做同样的事情。
结论
在文章中我们讨论了很多关于流的内容,现在你应该对数据库中的流有一定程度的了解。我们提供了一些示例并对背景中发生的事情进行了深入的解释。
请参考 MySQL 文档或上面提供的任何链接以了解更多信息。
谢谢