После года разработки и семи предварительных выпусков сформирован первый стабильный релиз новой ветки СУБД MariaDB 10.3, в рамках которой развивается ответвление от MySQL, сохраняющее обратную совместимость и отличающееся интеграцией дополнительных движков хранения и расширенных возможностей. Развитие MariaDB курирует независимая организация MariaDB Foundation в соответствии с полностью открытым и прозрачным процессом разработки, не зависящим от отдельных вендоров. MariaDB поставляется вместо MySQL во многих дистрибутивах Linux (RHEL, SUSE, Fedora, openSUSE, Slackware, OpenMandriva, ROSA, Arch Linux, Debian) и внедрён в таких крупных проектах, как Wikipedia, Google Cloud SQL и Nimbuzz.

Ключевые улучшения MariaDB 10.3:

  • Добавлена поддержка версионированных таблиц, в которых не только хранится актуальный срез данных, но сохраняется информация и о всех ранее внесённых изменениях. Версионированные таблицы могут применяться для аудита изменений, разбора инцидентов, анализа различий содержимого в разное время или отката состояния на определённый момент в прошлом. Версионирование включается при помощи выражения
    “CREATE TABLE … WITH SYSTEM VERSIONING” или “ALTER TABLE … ADD SYSTEM VERSIONING”;

  • Реализована независимая от движков хранения система сжатия содержимого столбцов. Для включения сжатия для столбца при его определении следует указать атрибут COMPRESSED. Для управления параметрами сжатия и оценки состояния предложены переменные column_compression_threshold, column_compression_zlib_level, column_compression_zlib_strategy, column_compression_zlib_wrap, column_compressions и column_decompressions;
  • Добавлена поддержка конструкторов табличных значений (table value constructor) для формирования содержимого простых таблиц. Например, можно использовать конструкции вида “WITH t (a,c) AS (SELECT * FROM VALUES (1,’xx’), (5,’yyy’), (1,’zzz’))…”;
  • Реализована поддержка невидимых столбцов, которые не выводятся в
    “SELECT *” и обрабатываются только в случае явного указания их имени. Определения невидимых столбцов осуществляется при помощи атрибута INVISIBLE в “CREATE TABLE” или “ALTER TABLE”;

  • Возможность создания агрегатных хранимых функций. При помощи выражения “CREATE AGGREGATE FUNCTION” теперь можно создавать свои агрегатные функции, обрабатывающие набор строк по аналогии с SUM, AVG и т.п.
  • В основной состав сервера включен плагин Semi-sync с реализацией псевдосинхронного механимзма репликации;
  • Добавлена поддержка последовательностей (sequence) и связанных с ними выражений CREATE SEQUENCE, SHOW CREATE SEQUENCE, ALTER SEQUENCE, DROP SEQUENCE, NEXT VALUE FOR, PREVIOUS VALUE FOR и SETVAL(). Последовательности могут указываться в секции DEFAULT в качестве значения по умолчанию;
  • Добавлена поддержка операций INTERSECT и EXCEPT, дополняющих функциональность выражения UNION (предполагают применение операции DISTINCT);
  • Добавлены опций WAIT и NOWAIT, которые можно использовать для управления поведением при наличии блокировок в момент выполнения операций (SELECT, ALTER, DROP и т.п.). При указании NOWAIT управление будет возвращено сразу с выводом ошибки, если выставлена блокировка, а через WAIT можно установить желаемое время таймаута;
  • В InnoDB добавлен режим мгновенного добавления столбцов, не требующий полного перестроения таблицы (вместо перестроения в таблицу добавляется специальная скрытая запись и обновляется словарь). Новый режим демонстрирует уровень сложности O(log n) вместо O(n·m) и позволяет почти мгновенно выполнять операции “ALTER … ADD COLUMN” на очень больших таблицах, добавление столбца в которых могло раньше занимать часы;
  • Существенно улучшена совместимость с СУБД Oracle в режиме “sql_mode=ORACLE”, в котором теперь поддерживается подмножество языка
    PL/SQL вместо традиционного для MariaDB синтаксиса хранимых процедур.
    В предоставляемом MariaDB диалекте языка хранимых процедур SQL/PL появилась поддержка пакетов в стиле Oracle. Реализованы выражения CREATE PACKAGE,
    CREATE PACKAGE BODY,
    DROP PACKAGE,
    DROP PACKAGE BODY,
    SHOW CREATE PACKAGE и SHOW CREATE PACKAGE BODY;

  • Оптимизация через преобразование предикатов “[NOT] IN” с длинным списком значений в эквивалентные подзапросы. Т.е. выражения вида “WHERE IN (value_list)” теперь преобразуются в “WITH t(col1, …) AS (SELECT * FROM VALUES value_list)” и “WHERE … IN (SELECT * FROM t)”;
  • Возможность применения выражений TYPE OF и ROW TYPE OF для переменных хранимых процедур и локальных переменных. Например, “DECLARE row1 ROW TYPE OF table1; DECLARE row2 TYPE OF row1”;
  • Возможность применения операции LIMIT внутри функции GROUP_CONCAT(), например, ‘GROUP_CONCAT(CONCAT_WS(“:”,date,cnt) ORDER BY cnt DESC LIMIT 1)’;
  • Добавлены новые оконные функции (window-функции или аналитические функции), позволяющие для каждой строки запроса выполнить вычисления, используя строки, связанные с текущей строкой: PERCENTILE_CONT, PERCENTILE_DISC и MEDIAN;
  • Добавлена поддержка выражения “FOR … END FOR” для создания внутри хранимых процедур циклов с стиле СУБД Oracle;
  • Для распределённых XA-транзакций добавлена поддержка команды “XA RECOVER FORMAT=’SQL'”, при котором данные выводятся не в бинарном, а в читаемом виде;
  • Добавлена совместимая с СУБД Oracle функция выделения подстрок SUBSTR();
  • Добавлена новая функция CHR(), возвращающая строку для заданного числового кода символа;
  • Добавлен вариант функции DATE_FORMAT с тремя аргументами (date, format, locale);
  • Для переменных в хранимых процедурах добавлен новый тип данных ROW;
  • Возможность определения курсоров с параметрами (“DECLARE cursor_name [cursor_formal_parameter[,…]] CURSOR FOR select_statement”);
  • В операциях UPDATE, охватывающих несколько таблиц, теперь допустимо использование выражений ORDER BY и LIMIT;
  • В операции UPDATE появилась возможность указания одной таблицы и в качестве источника данных и как целевой таблицы (возможность обновления таблицы, которая фигурирует в условиях WHERE). Например, “UPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);”;
  • В выражении DELETE обеспечена поддержка рекурсивных подзапросов (возможность удаления из таблицы, которая указана в подзапросе). Например, “DELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 b WHERE b.c2=0)”;
  • Добавлен новый SQL-режим одновременного назначения (sql_mode SIMULTANEOUS_ASSIGNMENT), при котором все присвоения в секции SET в выражении UPDATE выполняются одновременно, без последовательного прохода по значениям слева на право. Также добавлен режим sql_mode EMPTY_STRING_IS_NULL, при котором пустые строки интерпретируются как значения NULL;
  • В выражение “ALTER TABLE” добавлены две новые опции: “ALGORITHM=INSTANT” для исключения выполнения любых операций, которые модифицируют файлы с данными, и “ALGORITHM=NOCOPY” для исключения операций, которые могут привести к перестроению кластерного индекса;
  • В сервер добавлена поддержка протокола PROXY;
  • Во встраиваемой серверной библиотеке добавлена поддержка SSL при соединении с внешними серверами;
  • Добавлены переменные log_disabled_statements и log_slow_disabled_statements, позволяющие исключить попадание определённых выражений в общий лог и лог медленных запросов;
  • Временные файлы, создаваемые в процессе слияния с сортировкой и выполнения операции row log, теперь сохраняются в зашифрованном виде, если переменная innodb_encrypt_log выставлена в значение 1, независимо от того зашифрована или нет сама таблица;
  • В разряд стабильных переведён движок хранения Spider с системой шардинга, позволяющей разносить большие таблицы на несколько серверов. С точки зрения формирования запросов такие таблицы не отличаются от обычных локальных таблиц, но фактически при использовании Spider разные порции данных, составляющих одну таблицу, хранятся на разных серверах. Для обеспечения высокой доступности таблиц, распределённых по серверам при помощи Spider, может применяться репликация. В разнесённых на несколько серверов таблицах допускается выполнение XA-транзакций. В новой версии добавлена поддержка прямых операций слияния (JOINS и GROUP BY), обновления, удаления и агрегирования. В базирующемся на Spider движке Partition появилась поддержка полнотекстового поиска, чтения по нескольким диапазонам (Multi-range) и обработчиков HANDLER;
  • В разряд стабильных переведён движок хранения MyRocks, разработанный компанией Facebook на базе системы хранения RocksDB, оптимизированной для Flash-накопителей. В хранилище MyRocks применяются страницы данных плавающего размера, позволяющие избежать выравнивания по фиксированной границе блока, и модель хранения данных в форме лога (Log Structured Merge Trees), допускающая только дополнение (чистка производится сборщиком мусора). В процессе выполнения запросов в несколько раз сокращается число операций случайного чтения/записи, что приводит к увеличению производительности по сравнению с InnoDB на 20-30% на SSD и до 6 раз на НЖМД при нагрузке с большим числом операций случайной записи. Кроме того, MyRocks позволяет на 50% сократить размер БД по сравнению со сжатым хранилищем InnoDB и в 3.5 раза по сравнению с InnoDB без применения сжатия. Из недостатков MyRocks можно отметить отсутствие поддержки внешних ключей и полнотекстовых индексов.