MySQL продолжает наращивать инновации и теперь включает в себя богатые возможности процедурного программирования внутри базы данных. Отныне разработчики могут писать хранимые программы на языке JavaScript (функции и процедуры) в сервере баз данных MySQL. Хранимые программы будут выполняться с помощью GraalVM. Эта версия доступна в качестве "Preview" в MySQL Enterprise Edition и может быть загружена через Oracle Technology Network (OTN). MySQL-JavaScript также доступен в облачном сервисе MySQL Heatware на OCI, AWS и Azure.

Зачем нужны хранимые программы JavaScript?

JavaScript - самый популярный язык программирования среди разработчиков. Помимо более простого синтаксиса и поддержки современных возможностей языка, ключевым фактором его популярности является богатая экосистема, предоставляющая множество модулей многоразового использования кода.

Когда возникает необходимость в постоянном хранении данных, MySQL, самая популярная база данных с открытым исходным кодом, станет естественным выбором для JavaScript-разработчиков. Благодаря поддержке JavaScript в хранимых программах, разработчики смогут писать хранимые программы MySQL на знакомом языке и использовать преимущества обширной экосистемы JavaScript!

Поддержка хранимых программ на JavaScript не только повысит производительность разработчиков за счёт использования обширной экосистемы; теперь больше разработчиков будут обладать необходимыми навыками для написания хранимых программ. Другими словами, организации теперь могут задействовать более широкий спектр талантов разработчиков, используя широко доступный набор навыков JavaScript для разработки бэкенда.

Хранимые программы обладают ключевым преимуществом: они минимизируют перемещение данных между сервером базы данных и приложениями. Передача больших объемов данных, особенно при пакетной обработке, может быть проблематичной по многим причинам:

  • Это занимает много времени и может привести к значительным сетевым расходам.

  • Увеличение задержки может стать заметным, когда приложения "болтливы".

  • Обработка больших объемов данных на среднем или прикладном уровне требует больших объемов памяти и хранения, что увеличивает расходы.

  • Передача данных между машинами, особенно в облачных средах, часто должна быть исключена из-за рисков безопасности и требований к защите данных.

  • Перемещение больших объемов данных за пределы службы баз данных приводит к увеличению затрат на их передачу.

Использование хранимых программ для обработки данных в базе данных - распространённое решение этих проблем.

Новые примеры использования

MySQL-JavaScript открывает новые возможности в разработке приложений, которые раньше были технически ограничены. Хранимые программы на JavaScript позволяют разработчикам отказаться от перемещения данных и с лёгкостью реализовать расширенную логику обработки данных внутри базы данных. Ниже приведены примеры простых сценариев использования:

  • Извлечение данных: Извлечение информации из часто используемых сложных объектов в базах данных, например, из строк URL.

  • Форматирование данных: Создание форматированных строк с использованием широко распространённых схем шаблонизации, например, пакета JavaScript Mustache.

  • Приближённый поиск: Использование функций оценки сходства в запросах SELECT, например, для извлечения похожих строк из таблицы.

  • Валидация данных: Очистка данных с помощью сложных правил валидации. Например, с помощью пакета JavaScript Validator.

  • Сжатие / кодирование: Используйте пользовательские алгоритмы, не входящие в состав MySQL, для сжатия и шифрования данных.

  • Трансформация данных: Изменение представления данных, например, преобразование столбцов строк в разрежённое матричное представление, используемое при построении признаков.

Приведённые примеры - это всего лишь взгляд на потенциал этой функции. Существуют и более сложные варианты использования, например развёртывание полных конвейеров данных или создание среды для приложений машинного обучения.

MySQL-JavaScript

MySQL представляет поддержку хранимых программ на JavaScript. Теперь пользователи могут выражать богатую процедурную логику внутри базы данных. Выполнение JavaScript проводится через GraalVM, где пользователь может использовать все возможности GraalVM Enterprise Edition (EE), такие как оптимизация компилятора, производительность и безопасность, без дополнительных затрат.

В этом выпуске реализована поддержка:

  • Язык JavaScript, основанный на ECMAScript 2021

  • Хранимые процедуры и хранимые функции

  • Типы данных MySQL, такие как все варианты целых чисел, плавающая точка и типы CHAR/VARCHAR

Стандартная библиотека ECMAScript включает в себя множество базовых операций и структур данных, что делает её реализацию простой и выразительной. Разработчик также может использовать миллионы доступных пакетов сторонних разработчиков из онлайн менеджеров пакетов, таких как "npm".

Что за GraalVM?

GraalVM - это экосистема компиляторов Oracle, включающая JDK, реализации таких языков, как JavaScript, R, Python, Ruby и Java. Она включает в себя технологии компиляции "точно в срок" (JIT) и "с опережением" (AOT). Она также предоставляет полностью управляемую виртуальную машину с возможностью создания "песочницы" и поддержкой инструментария. MySQL-JavaScript интегрирован с GraalVM Enterprise edition.

Определение хранимых программ JavaScript

Для создания хранимой программы JavaScript в MySQL можно использовать вариант тех же операторов 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. Для хранимых процедур поддерживаются как входные, так и выходные параметры.

Выполнение кода JavaScript внутри операторов SQL

Функция JavaScript может быть вызвана из операторов SQL везде, где может быть вызвана традиционная функция SQL: в выражениях SELECT, WHERE, GROUP BY и ORDER BY, DML, DDL, Views и других. Вот пример 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;

Отладка JavaScript-кода внутри MySQL

Отладка идет рука об руку с разработкой программного обеспечения. Функция 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>

Безопасность

Поддержка JavaScript в MySQL обеспечивает высочайший уровень безопасности, изоляции и защиты данных. JavaScript для MySQL опирается на проверенные в отрасли гарантии безопасности Oracle GraalVM.

Песочница VM гарантирует, что вредоносный код не сможет скомпрометировать другие модули сервера MySQL. Каждая хранимая программа анализируется и выполняется в своём собственном контексте. Такая политика изоляции не позволяет одной хранимой программе читать или изменять данные или код другой хранимой программы. Создание или манипулирование потоками из пользовательского кода JavaScript ограничено, а пользовательский код JavaScript не имеет доступа к сетевым коммуникациям или файловой системе.

Хранимые программы JavaScript основаны на стандартной модели привилегий MySQL. Только привилегированным пользователям разрешено создавать хранимые программы. Доступ к SP также можно контролировать с помощью привилегий. Один пользователь может определить хранимые программы, которые могут быть выполнены другими.

Совместимость

Хранимая программа на JavaScript работает без проблем с традиционными хранимыми программами SQL. Функция не зависит от движка хранения, доступ к данным может осуществляться прозрачно из InnoDB, Lakehouse и HeatWave.

MySQL Heatwave Service теперь поставляется с предустановленным и настроенным JavaScript в развертываниях сервисов OCI, AWS и Azure. Для MySQL Enterprise Edition эта функция требует ручной установки и настройки.

Производительность

Интеграция MySQL-JavaScript использует специальную виртуальную машину для конкретного случая использования, чтобы обеспечить наилучшую сквозную производительность. Эта настройка основана на опережающей компиляции (AOT) GraalVM, при которой реализация языка компилируется в собственное двоичное представление для быстрой обработки.

GraalVM имеет собственную реализацию JavaScript, основанную на стандарте ECMAScript 2021. Реализация языка конкурентоспособна с точки зрения производительности, хотя она реализована с использованием фреймворка GraalVM Polyglot, который фокусируется на поддержке нескольких языков программирования в рамках одной ВМ.

Наконец, функция MySQL-JavaScript использует различные современные оптимизации, которые поставляются с корпоративной версией GraalVM, такие как оптимизация компилятора, включая агрессивный инлайнинг и анализ частичных выходов. Сюда также входит компилятор с профилем just-in-time (JIT), который переключается между интерпретатором и нативной компиляцией во время выполнения.

Заключение

MySQL-JavaScript позволяет разработчикам выражать сложную логику программирования непосредственно внутри сервера MySQL. Это позволяет разработчикам приблизить части приложений, требующие больших объемов данных, к данным, сократив расходы на их перемещение. Использование JavaScript, основанного на ECMAScript 2021, предотвращает проблемы привязки к производителю, а разработчик получает все преимущества GraalVM (Enterprise Edition) без дополнительных затрат. Чтобы бесплатно опробовать MySQL-JavaScript, загрузите MySQL Enterprise Edition с сайта Oracle Technology Network (OTN). MySQL-JavaScript также легко интегрируется с облачным сервисом MySQL HeatWave, где разработчикам доступны самые последние инновации.

Хотите узнать больше?

За подробностями обращайтесь к Руководству пользователя (Хранимые программы JavaScript, раздел 25.3).

Комментарии (6)


  1. Akuma
    10.01.2024 08:15
    +5

    Они же в курсе, что мир JS работает исключительно на транспиляторах? Люди потащат в MySQL Typescript, Vite, Webpack, React, WASM попробуют запихнуть, SSR/SSG на MySQL, NextJS "use server mysql". Это ж Ад 2.0 :)


    1. Helldar Автор
      10.01.2024 08:15
      +3

      Q: Какая ваша любимая среда для разработки фронтенда и бэкенда?

      A: MySQL

      ????


      1. Akuma
        10.01.2024 08:15
        +2

        Люди только открыли для себя мир статических сайтов через Astro, а теперь снова придется все переписывать на MySQL.

        Страшно, что это не шутка.


  1. IgorAlentyev
    10.01.2024 08:15
    -2

    Слышал что сейчас за хранимки в бд бьют ногами, потому что это невозможно поддерживать. Что то изменилось?


    1. Akina
      10.01.2024 08:15
      +2

      Слышал что сейчас за хранимки в бд бьют ногами, потому что это невозможно поддерживать.

      Вот программируешь ты на каком-то языке... тебе вообще приходит в голову поддерживать встроенные функции этого языка? что, нет? а отлаженная хранимая процедура или пользовательская функция в базе данных ничем от такой встроенной функции языка не отличается. Ну если она, конечно, хорошо написана, тщательно отлажена и правильно и качественно документирована.

      Проблема в другом - большинство программистов отлично разбираются в своём ЯП, как правило, неплохо разбираются в фреймворке, который применяют для доступа к базе данных.. но вот со знанием именно SQL у них зачастую весьма серьёзные проблемы. Иной раз смотришь на хранимую процедуру - и слёзы бегут кровавые... ну да, ногами. Много вы знаете команд, где есть выделенные SQL-программисты высокой квалификации? В лучшем случае есть админ, которому написание хранимых объектов - задача ни разу не профильная, и выполняется она соответственно.


      1. BigDflz
        10.01.2024 08:15
        +1

        как приятно читать защитника хранимок, а то тут мне навтыкали кучу минусов в карму только за упоминание о них. и ещё приятнее почитать одного из гуру очень популярного ранее форума.