MySQL 中引入 JavaScript 支持

更新日期: 2024-01-17阅读: 1.4k标签: mysql

MySQL 不断加速创新,现在在数据库中包含丰富的过程编程功能。开发人员现在可以在 MySQL 数据库服务器中编写 JavaScript 存储程序。存储的程序将与GraalVM运行时一起运行。它在 MySQL 企业版中作为预览版提供,并且可以通过Oracle 技术网 (OTN)下载。MySQL-JavaScript 还可在 OCI、AWS 和 Azure 上的 MySQL Heatwave 云服务中使用。


为什么选择 JavaScript 存储程序?

JavaScript 是开发人员中最流行的编程语言。除了更简单的语法和对现代语言功能的支持之外,其受欢迎的一个关键因素是丰富的生态系统,提供了大量可重用的代码模块。

当需要持久存储时,最流行的开源数据库MySQL将是JavaScript开发人员的自然选择。通过在存储程序中支持 JavaScript,开发人员将能够用熟悉的语言编写 MySQL 存储程序,并利用广泛的 JavaScript 生态系统!

对JavaScript存储程序的支持,不仅可以利用庞大的生态系统来提高开发人员的生产力;现在,更多的开发人员将具备编写存储程序所需的技能。换句话说,组织现在可以利用广泛可用的 JavaScript 技能集进行后端开发,从而挖掘更广泛的开发人才。

存储程序的一个关键优势是最大限度地减少数据库服务器和应用程序之间的数据移动。由于多种原因,传输大量数据(尤其是批处理数据)可能会出现问题:

  1. 它非常耗时,并且可能会导致大量的网络开销。
  2. 当应用程序“喋喋不休”时,延迟的增加可能会变得明显。
  3. 在中间层或应用层处理大量数据需要大量内存和存储,从而增加了成本。
  4. 由于安全风险和数据保护要求,通常必须避免机器之间的数据传输,尤其是在云环境中。
  5. 将大量数据移至数据库服务之外会增加出口成本。使用存储程序处理数据库中的数据是解决这些问题的常见方法。

新用例

MySQL-JavaScript 为应用程序设计带来了新的机遇,而这些机遇曾经因权衡而受到限制。JavaScript 存储程序使开发人员能够避开数据移动并轻松在数据库内无缝实现高级数据处理逻辑。下面列出了一些简单用例的示例:

  1. 数据提取:从数据库中常用的复杂对象中提取信息,例如URL字符串。
  2. 数据格式化:使用广泛使用的模板化方案(例如 JavaScript Mustache 包)生成格式化字符串。
  3. 近似搜索:在 SELECT 查询中使用相似性评分函数,例如,从表中检索相似的字符串。
  4. 数据验证:使用复杂的验证规则清理数据。例如,使用 JavaScript Validator 包。
  5. 压缩/编码:使用 MySQL 中未包含的自定义算法进行数据压缩和加密。
  6. 数据转换:更改数据表示形式,例如将字符串列转换为特征工程中使用的稀疏矩阵表示形式。提供的示例只是对该功能潜力的一瞥。存在更复杂的用例,例如部署完整的数据管道和为机器学习应用程序设置暂存环境。


MySQL-JavaScript

MySQL 正在引入对 JavaScript 存储程序的支持。用户现在可以在数据库内表达丰富的过程逻辑。JavaScript 运行时通过 GraalVM 集成,用户可以使用 GraalVM 的所有企业版 (EE) 功能,例如编译器优化、性能和安全功能,无需额外费用。

此版本支持:

  1. 基于 ECMAScript 2021的 JavaScript 语言 存储过程和存储函数
  2. MySQL 数据类型,例如整数、浮点和 CHAR/VARCHAR 类型的所有变体
  3. ECMAScript 标准库包含许多基本使用操作和数据结构,使实现变得简单且富有表现力。开发人员还可以重用来自“npm”等在线包管理器的数百万个可用的第三方包。


什么是 GraalVM?

GraalVM是一个 Oracle 编译器生态系统,包括 JDK、JavaScript、R、Python、Ruby 和 Java 等语言实现。它包括即时(JIT)和提前(AOT)编译技术。它还提供具有沙箱功能和工具支持的完全托管虚拟机。MySQL-JavaScript 与 GraalVM 企业版集成。


定义 JavaScript 存储程序

要在 MySQL 中创建 JavaScript 存储程序,您可以使用用于传统存储函数和过程的相同 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 可调用函数的定义中。参数的名称可以在 JavaScript 代码中直接引用,并且当函数被调用时,SQL 类型和 JavaScript 类型之间会进行隐式类型转换。要调用 JavaScript 存储过程,应使用 CALL 语句,类似于常规 SQL 存储过程。存储过程支持输入和输出参数。


在 SQL 语句中执行 JavaScript 代码

JavaScript 函数可以在任何可以调用传统 SQL 函数的地方从 SQL 语句调用;在 SELECT 表达式、WHERE、GROUP BY 和 ORDER BY 子句、DML、DDL、视图等中。下面是调用我们上面定义的函数的 SQL 语句示例:

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 中调试 JavaScript 代码

调试与软件开发密切相关。MySQL-JavaScript 功能公开了额外的 SQL 接口以帮助故障排除,而 JavaScript 程序在数据库中运行。

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 错误的转换是透明发生的。除了标准输出之外,开发人员还可以访问 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>


安全

MySQL 中的 JavaScript 支持提供最高级别的安全性、隔离和数据保护。JavaScript for MySQL 依赖于经过行业验证的 Oracle GraalVM 安全保证。

VM沙箱确保恶意代码无法危害MySQL服务器的其他模块。每个存储程序都在其自己的上下文中解析和执行。这一隔离策略不允许一个存储程序读取或修改其他存储程序的数据或代码。从 JavaScript 用户代码生成或操作线程受到限制,并且 JavaScript 用户代码无法访问网络通信或文件系统。

JavaScript 存储程序构建在标准 MySQL 权限模型之上。仅允许特权用户创建存储程序。对SP的访问也可以通过权限进行控制。一个用户可以定义可由其他人执行的存储程序。


兼容性

JavaScript 存储程序与传统 SQL 存储程序无缝协作。该功能与存储引擎无关,可以从 InnoDB Lakehouse 和 HeatWave 透明地访问数据。

MySQL Heatwave 服务现在在 OCI、AWS 和 Azure 服务部署上预安装和配置了 JavaScript。对于 MySQL 企业版,该功能需要手动安装和配置。


表现

MySQL-JavaScript 集成使用针对其特定用例定制的 VM,以实现最佳的端到端性能。这种定制基于 GraalVM 的提前 (AOT) 编译,其中语言实现被编译为本机二进制表示形式以进行快速处理。

GraalVM 有自己的基于 ECMAScript 2021 标准的 JavaScript 实现。该语言实现在性能方面具有竞争力,尽管它是使用 GraalVM 的 Polyglot 框架实现的,该框架专注于在同一 VM 中支持多种编程语言。

最后,MySQL-JavaScript 功能受益于 GraalVM 企业版附带的各种最先进的优化,例如包括积极内联和部分转义分析在内的编译器优化。它还包括一个配置文件引导的即时 (JIT) 编译器,可在运行时在解释器和本机编译之间切换。


结论

MySQL-JavaScript 使开发人员能够直接在 MySQL 服务器内表达复杂的编程逻辑。这使得开发人员能够将应用程序的数据密集型部分推送到靠近数据的位置,从而降低数据移动成本。使用基于 ECMAScript 2021 的 JavaScript 可以防止供应商锁定问题,同时开发人员无需额外付费即可享受 GraalVM(企业版)的所有优势。要免费试用 MySQL-JavaScript,请从Oracle 技术网 (OTN)下载 MySQL 企业版。MySQL-JavaScript 还与 MySQL HeatWave 云服务无缝集成,开发人员可以轻松获得最新的创新成果。

来自:https://www.sibida.net/detail/7942

链接: https://fly63.com/article/detial/12637

node如何和MySQL进行通信

Node.js与MySQL交互操作有很多库,常用最多的是mysql模块,mysql数注意:安装前先把目录cd到node.exe所在目录下,这样执行安装命令时,这篇文章主要介绍:链接mysql的流程、数据库连接参数说明、MYSQL CURD操作、连接池Pooling connections、断线重连、防止SQL注入

MySQL 常用30种SQL查询语句优化方法

MySQL查询语句优化方法:应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

一个案例彻底弄懂如何正确使用 mysql inndb 联合索引

有一个业务是查询最新审核的5条数据,查看当时的监控情况 cpu 使用率是超过了100%,show processlist看到很多类似的查询都是处于create sort index的状态。索引有一个audit_time在左边的联合索引,没有关于status的索引。

mysql数据库使用insert语句插入中文数据报错

在mysql的命令行模式中,通过insert语句插入中文数据的时候报错,类似于下面这样,造成这个错误通常是由于创建数据表的时候使用了不正确的编码格式,可以使用如下命令查看操作的目标数据表的编码格式。

MySQL技术内幕:InnoDB存储引擎

本文绝大部分内容来源《MySQL技术内幕:InnoDB存储引擎》一书。InnoDB存储引擎是多线程模型,其后台有多个不同的后台线程,负责处理不同的任务。

MYSQL中视图的使用

什么是视图?执行一条SQL,将结果集保存在一张虚拟表中。在视图创建后,可以用与表基本相同的方式使用(查询、过滤、排序数据、与其他视图或连结、(添加、更新))视图只是用来查看存储在别处的数据的设施,本身不包含数据,返回的数据也是从其他表检索出来的。

Mysql常用函数

MySQL数据库中提供了很丰富的函数。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。

mysql innodb索引原理

innodb存储引擎表是索引组织表,表中数据按照主键顺序存放。其聚集索引就是按照每张表的主键顺序构造一颗B+树,其叶子结点中存放的就是整张表的行记录数据,这些叶子节点成为数据页。

一条sql语句在mysql中是如何执行的

最近开始在学习mysql相关知识,自己根据学到的知识点,根据自己的理解整理分享出来,本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的。

mysql统计行数时到底应该怎么count

每个人在写代码时都有遇到过要获取MYSQL表里数据行数的情况,多数人获取数据表行数时都用COUNT(*),但同时也流传了不少其他方式,比如说COUNT(1)、COUNT(主键)、COUNT(字段)。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!