飛鳥開發MySQL盤口時搭建的資料流是什麼,以及微盤它是如何工作的?(下)

TG_duotebb發表於2022-06-11

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 文件或上面提供的任何連結以瞭解更多資訊。

謝謝


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70017861/viewspace-2900083/,如需轉載,請註明出處,否則將追究法律責任。

相關文章