MySQL 正式引入 JavaScript 支持!
近期,MySQL 官方宣布了正式在 MySQL 中引入了 JavaScript 支持!
下面是 MySQL 官方的描述:
MySQL正在持續(xù)推動創(chuàng)新,現(xiàn)在已在數(shù)據(jù)庫內(nèi)部包含豐富的過程式編程能力。開發(fā)者現(xiàn)在可以在MySQL數(shù)據(jù)庫服務(wù)器中編寫JavaScript存儲程序(函數(shù)和過程)。這些存儲程序?qū)⑹褂?GraalVM運行時進行運行。
這一舉措還是相當炸裂的,繼瀏覽器、服務(wù)端、客戶端之后, JavaScript 語言終于卷到數(shù)據(jù)庫上面了!
JavaScript 存儲過程
JavaScript 是開發(fā)人員中最流行的編程語言。除了簡單的語法和對現(xiàn)代語言特性的支持外,它的流行之處在于豐富的生態(tài)系統(tǒng),提供了大量可重用的代碼模塊。
當需要持久性存儲時,MySQL 作為最流行的開源數(shù)據(jù)庫,將成為 JavaScript 開發(fā)人員的自然選擇。通過支持存儲過程中的 JavaScript,開發(fā)人員將能夠用熟悉的語言編寫 MySQL 存儲過程,并利用廣泛的 JavaScript 生態(tài)系統(tǒng)!
支持 JavaScript 存儲過程不僅可以通過利用大型生態(tài)系統(tǒng)提高開發(fā)人員的生產(chǎn)力,還可以讓更多的開發(fā)人員掌握編寫存儲過程所必需的技能。換句話說,公司現(xiàn)在可以利用廣泛可獲得的 JavaScript 技能集進行后端開發(fā),從而吸引更廣泛的開發(fā)人才。
存儲過程通過減少數(shù)據(jù)庫服務(wù)器和應(yīng)用程序之間的數(shù)據(jù)移動,提供了一個重要的優(yōu)勢。
傳輸大量數(shù)據(jù),尤其是用于批處理,可能會帶來很多問題:
- 這需要耗費時間,并且可能會導(dǎo)致網(wǎng)絡(luò)開銷增加。
- 當應(yīng)用程序進行頻繁交互時,增加的延遲可能會變得明顯。
- 在中間層或應(yīng)用層處理大容量數(shù)據(jù)需要大量的內(nèi)存和存儲資源,增加了成本。
- 由于安全風(fēng)險和數(shù)據(jù)保護要求,通常需要避免在機器之間傳輸大量數(shù)據(jù),尤其是在云環(huán)境中。
- 將大量數(shù)據(jù)移出數(shù)據(jù)庫服務(wù),將增加出口費用。
使用存儲過程在數(shù)據(jù)庫內(nèi)部處理數(shù)據(jù)是解決這些問題的常見方法。
使用場景
MySQL-JavaScript 為應(yīng)用程序設(shè)計提供了新的機會,這些機會在過去受到權(quán)衡的限制。JavaScript 存儲過程使開發(fā)人員能夠回避數(shù)據(jù)移動,并輕松地在數(shù)據(jù)庫內(nèi)部實現(xiàn)高級數(shù)據(jù)處理邏輯。以下是一些簡單用例的示例:
- 數(shù)據(jù)提取:從數(shù)據(jù)庫中常用的復(fù)雜對象中提取信息,例如
URL字符串。 - 數(shù)據(jù)格式化:使用廣泛使用的模板化方案(如
JavaScript的Mustache包)生成格式化的字符串。 - 近似搜索:在
SELECT查詢中使用相似性評分函數(shù),例如從表中檢索相似的字符串。 - 數(shù)據(jù)驗證:使用復(fù)雜的驗證規(guī)則清理數(shù)據(jù)。例如,使用
JavaScript的Validator。 - 壓縮/編碼:使用
MySQL中未包含的自定義算法進行數(shù)據(jù)壓縮和加密。 - 數(shù)據(jù)轉(zhuǎn)換:更改數(shù)據(jù)表示,例如將字符串列轉(zhuǎn)換為特征工程中使用的稀疏矩陣表示。
這些示例只是最簡單和常見的案例,實際上還會有很多復(fù)雜的場景,例如部署完整的數(shù)據(jù)管道和設(shè)置機器學(xué)習(xí)應(yīng)用程序的分段環(huán)境等。
MySQL-JavaScript
MySQL 現(xiàn)在引入了對 JavaScript 存儲過程的支持,用戶現(xiàn)在可以在數(shù)據(jù)庫內(nèi)部表達豐富的過程邏輯。JavaScript 運行時通過 GraalVM 集成,用戶可以免費使用 GraalVM 企業(yè)版(EE)的所有功能,如編譯器優(yōu)化、性能和安全功能。
此版本支持以下功能:
- 基于
ECMAScript 2021的JavaScript語言 - 存儲過程和存儲函數(shù)
-
MySQL數(shù)據(jù)類型,如各種整數(shù)、浮點數(shù)和CHAR/VARCHAR類型
ECMAScript 標準庫包括許多基本的使用操作和數(shù)據(jù)結(jié)構(gòu),使實現(xiàn)變得簡單和表達性強。開發(fā)人員還可以從在線軟件包管理器(如 “npm” )中重復(fù)使用數(shù)百萬個可用的第三方軟件包。
GraalVM
GraalVM 是 Oracle 的編譯器生態(tài)系統(tǒng),包括 JDK、JavaScript、R、Python、Ruby 和 Java 等語言實現(xiàn)。它包含即時編譯(JIT)和預(yù)編譯(AOT)技術(shù)。它還提供了一個完全托管的虛擬機,具有沙箱能力和工具支持。MySQL-JavaScript 與 GraalVM 企業(yè)版集成在一起。
定義 JavaScript 存儲過程
要在 MySQL 中創(chuàng)建 JavaScript 存儲過程,你可以使用用于傳統(tǒng)存儲函數(shù)和存儲過程的 SQL 語句的變體:
CREATE FUNCTION gcd_js (a INT, b INT) RETURNS INT
LANGUAGE JAVASCRIPT AS $$
let [x, y] = [Math.abs(a), Math.abs(b)];
while(y) [x, y] = [y, x % y];
return x;
$$;
從上面的示例中可以看出,JavaScript 代碼直接嵌入在 SQL 可調(diào)用函數(shù)的定義中。參數(shù)的名稱可以直接在 JavaScript 代碼中引用,在調(diào)用函數(shù)時,SQL 類型和 JavaScript 類型之間會進行隱式類型轉(zhuǎn)換。要調(diào)用 JavaScript 存儲過程,應(yīng)使用 CALL 語句,類似于常規(guī) SQL 存儲過程。存儲過程支持輸入和輸出參數(shù)。
在 SQL 語句中執(zhí)行 JavaScript 代碼
JavaScript 函數(shù)可以在任何傳統(tǒng) SQL 函數(shù)可以被調(diào)用的地方被 SQL 語句調(diào)用;在 SELECT 表達式、WHERE、GROUP BY 和 ORDER BY 子句、DMLs、DDLs、視圖等等。以下是一個 SQL 語句的示例,它調(diào)用了我們上面定義的函數(shù):
SELECT col1, col2, gcd_js(col1,col2)
FROM my_table
WHERE gcd_js(col1, col2) > 1
ORDER BY gcd_js(col1, col2);
CREATE TABLE gcd_table
AS SELECT gcd_js(col1,col2)
FROM my_table;
在 MySQL 中調(diào)試 JavaScript 代碼
調(diào)試與軟件開發(fā)緊密相連,MySQL-JavaScript 特性提供了額外的 SQL 接口以幫助故障排查,同時 JavaScript 程序在數(shù)據(jù)庫中運行。
CREATE PROCEDURE division (IN a INT, IN b INT,
OUT result DOUBLE) LANGUAGE JAVASCRIPT AS $$
function validate(num) {
console.log("validating input value: ", num);
if (num === 0) throw ("Division by Zero!");
}
validate(b);
result = a / b;
$$
JavaScript 異常到 MySQL 錯誤的轉(zhuǎn)換是完全透明的。開發(fā)人員也可以訪問 JavaScript 堆棧跟蹤,以及標準輸出。
CALL division( 5, 0, @res);
ERROR 6000 (HY000): JavaScript> Division by Zero!
SELECT mle_session_state("stdout");
validating input value: 0
SELECT mle_session_state("stack_trace");
<js> validate(division:9:187-214)
<js> division(division:11:222-232)
<js> :anonymous(division:15:256-265)
</js></js></js>
安全、性能、兼容性
安全、性能、兼容性這三個方面可謂是開發(fā)者對一項技術(shù)最重要的關(guān)注點了。
-
安全:
MySQL對JavaScript的支持提供了最高級別的安全性、隔離性和數(shù)據(jù)保護。虛擬機沙盒確保惡意代碼不能妨害MySQL服務(wù)器的其他模塊。每個存儲程序都在其自己的上下文中解析和執(zhí)行。這種隔離策略不允許一個存儲程序讀取或修改其他存儲程序的數(shù)據(jù)或代碼。JavaScript用戶代碼中的線程生成或操作被限制,JavaScript用戶代碼無法訪問網(wǎng)絡(luò)通信或文件系統(tǒng)。JavaScript存儲程序建立在標準的MySQL權(quán)限模型之上。只有擁有特權(quán)的用戶才允許創(chuàng)建存儲程序。 -
性能:采用特定用途定制的
VM,MySQL和JavaScript的集成能提供最優(yōu)的端對端性能。該定制基于GraalVM的預(yù)編譯(AOT),即把語言實施編譯為原生二進制形式,以加快處理速度。 -
兼容性:
JavaScript存儲程序與傳統(tǒng)的SQL存儲程序無縫協(xié)同工作。這個特性對存儲引擎保持中立,可以從InnoDB,Lakehouse和HeatWave中透明地訪問數(shù)據(jù)。MySQL Heatwave服務(wù)現(xiàn)在帶有預(yù)安裝和配置的JavaScript,可在OCI,AWS和Azure服務(wù)部署中使用。
大家對這項支持怎么看?歡迎在評論區(qū)留言~
