Ключевые улучшения MySQL 8.0:
- Добавлены оконные функции (window-функции или аналитические функции), позволяющие для каждой строки запроса выполнить вычисления, используя строки, связанные с текущей строкой. В отличие от агрегатных функций над сгруппированными строками, которые свёртывают сгруппированный набор строк в одну строку, оконные функции производят агрегирование для каждой строки в результирующем наборе. Реализованы как специальные оконные функции RANK, LAG, ROW_NUMBER, FIRST_VALUE, LEAD, LAG и NTILE, так и возможность применение некоторых агрегатных функций в форме оконных (например, COUNT, SUM, AVG, MIN, MAX);
- Поддержка рекурсивных и не рекурсивных обобщённых табличных выражений (Common Table Expression), позволяющих использовать временные именованные результирующие наборы, задаваемые при помощи оператора WITH;
- В InnoDB добавлена поддержка опций NOWAIT и SKIP LOCKED, которые можно использовать для управления поведением при наличии блокировок в момент выполнения выражений "SELECT ... FOR SHARE" и "SELECT ... FOR UPDATE". При указании NOWAIT управление будет возвращено сразу с выводом ошибки, если запрошенная строка заблокирована другой транзакцией, а при "SKIP LOCKED" заблокированные строки будут исключены из результирующего набора;
- Поддержка невидимых индексов (Invisible Indexes), которые никогда не используются оптимизатором. Управление видимостью индекса производится при помощи ключевых слов VISIBLE и INVISIBLE. Обычный видимый индекс может быть превращён в невидимый и наоборот. Невидимые индексы можно использовать для тестирования влияния того или иного индекса на производительность, без физического удаления данного индекса (индекс можно перевести в режим невидимого, изучить изменение производительности и вернуть обратно);
- Поддержка нисходящих индексов (descending indexes), позволяющих использовать оператор "DESC" при определении индекса для сохранения значений ключей в порядке убывания. В работе подобные индексы не требуют сканирования в обратном порядке, что значительно увеличивает эффективность работы с убывающими значениями;
- Реализована функция GROUPING(), которая позволяет отделить NULL-значения, полученные в результате агрегирования строк при группировке GROUP BY с использованием таких расширений, как ROLLUP, от NULL-значений в обычных сгруппированных строках;
- Добавлены новые подсказки для управления поведением оптимизатора (задаются внутри комментария /*+ */, указываемого сразу после ключевых слов SELECT, INSERT, REPLACE, UPDATE и DELETE): INDEX_MERGE и NO_INDEX_MERGE для управления поведением слияния индексов для отдельных запросов, JOIN_FIXED_ORDER, JOIN_ORDER, JOIN_PREFIX и JOIN_SUFFIX для управления порядком обработки таблиц при выполнении слияния, SET_VAR для установки системной переменной в контексте текущего выражения;
- Добавлены новые функции для манипуляции данными в формате JSON:
- Расширен синтаксис для определения диапазонов значений в JSON, например "SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]');".
- Добавлена поддержка табличных функций, позволяющих использовать SQL для данных JSON (при помощи функции JSON_TABLE() создаётся реляционное представление данных JSON).
- Добавлены агрегатные функции JSON_ARRAYAGG() для генерации массивов JSON и JSON_OBJECTAGG() для генерации объектов JSON.
- Добавлены функции слияния JSON_MERGE_PATCH() и JSON_MERGE_PRESERVE().
- Добавлена функция JSON_PRETTY() для приведения блоков JSON к читаемому виду;
- Добавлена функция JSON_STORAGE_SIZE() для вычисления размера, который занимает объект JSON;
- От 1.2 до 18 раз увеличена производительность сортировки и группировки значений JSON;
- Добавлен режим работы в качестве хранилища документов (Document Store), к которому можно обращаться с использованием методов NoSQL (коллекции JSON без предварительно определяемой схемы хранения). Функциональность реализована при помощи плагина mysqlxplugin;
- Добавлена поддержка пространственных типов данных, индексов и функций, позволяющих работать с географическими координатами и картографическими данными;
- По умолчанию задействована кодировка UTF8MB4 (ранее применялась кодировка latin1) и поддержка свойства локали "Collation", позволяющего задавать правила сортировки и методы сопоставления с учётом смысла символов. По сравнению с версией MySQL 5.7 существенно (до 20 раз) увеличена производительность сортировки данных в кодировке UTF8MB4;
- Добавлены новые функции для использования регулярных выражений REGEXP_INSTR(), REGEXP_LIKE(), REGEXP_SUBSTR() и долгожданная функция замены при помощи регулярных выражений REGEXP_REPLACE(). Кроме того, в регулярных выражениях реализована корректная работа с многобайтовыми Unicode-символами;
- Transactional Data Dictionary - новый механизм хранения системных данных, поддерживающий транзакции и реализованный в виде набора SQL-таблиц, хранимых в отдельном табличном пространстве InnoDB (хранение системных данных и метаданных в MyISAM прекращено);
- Новая [urlhttps://dev.mysql.com/doc/refman/8.0/en/roles.html]система ролей[/url] (именованных коллекций привилегий), позволяющая делегировать и блокировать полномочия для групп пользователей;
- Добавлена возможность переименования столбцов (ALTER TABLE ... RENAME COLUMN old_name TO new_name);
- Задействован по умолчанию плагин аутентификации caching_sha2_password, использующий SHA-256 для хэширования паролей, но по сравнению с плагином sha256_password обеспечивающий более высокую производительность за счёт использования кэширования;
- Добавлена защита от атак по подбору паролей. В случае нескольких неудачных попыток аутентификации теперь между следующими попытками добавляется задержка;
- Добавлена команда "SET PERSIST", позволяющая менять значения переменных конфигурации с сохранением их между перезапусками. Также добавлена команда RESTART, позволяющая удалённо перезапустить MySQL при наличии соответствующих полномочий;
- В качестве библиотеки с реализацией TLS/SSL по умолчанию задействован OpenSSL;
- Добавлена поддержка шифрования Undo- и Redo-логов;
- Проведены различные оптимизации производительности, например, в тесте upto при 4 одновременно работающих клиентах достигнуто почти двухкратное ускорение - продемонстрирована производительность на уровне 1.8 млн запросов в секунду. Скорость запросов к таблицам Performance Schema возросла до 30 раз, а к таблицам Information Schema до 100 раз.