Oracle представила перший стабільний реліз СУБД MySQL 8.0
Ключові покращення MySQL 8.0:
- Додані віконні функції (функція Windows або аналітичні функції), що дозволяють для кожного рядка запиту виконати обчислення, використовуючи рядки, пов'язані з поточним рядком. На відміну від агрегатних функцій над згрупованими рядками, які згортають згрупований набір рядків в один рядок, віконні функції агрегують для кожного рядка в результуючому наборі. Реалізовані як спеціальні віконні функції 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, JO управління порядком обробки таблиць під час злиття, 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 припинено);
- Нова система ролей (іменованих колекцій привілеїв), що дозволяє делегувати та блокувати повноваження для груп користувачів;
- Додано можливість перейменування стовпців (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 разів.