Неожиданно для себя обнаружил, что mysql вдруг релизнулся буквально на днях (19 апреля), а статьи на хабре нет — все обсуждают сами-знаете-что.


Постараюсь перевести выжимку из "What's new". Для тех, кто следит за разработкой, тут вероятно не будет ничего или почти ничего нового, для интересующихся время от времени — может показаться интересным. Сразу скажу, что в оригинальном посте более детальный
разбор всех пунктов — тут лишь краткая выжимка со ссылочками.


Оригинал


  • SQL Window functions — оконные функции
  • Common Table Expressions — Конструкции вида ```sql
    WITH
    cte1 AS (SELECT a, b FROM table1),
    cte2 AS (SELECT c, d FROM table2)
    SELECT b, d FROM cte1 JOIN cte2
    WHERE cte1.a = cte2.c;

Теперь появилась возможность проделывать трюки вида выведи мне числа фибоначчи или обойди мне дерево


  • NOWAIT and SKIP LOCKED — Запретить запросу ждать блокировку на уровне таблицы и на уровне отдельных строк, соответственно.
  • Descending Indexes — индексы "по убыванию"
  • Grouping — функция grouping в GROUP BY конструкциях
  • Regular Expressions — сделали наконец REGEXP_REPLACE
  • Character Sets — позакрывали, что могли
  • Cost Model — внутренности оптимизатора запросов
  • Histograms — гистограммы для анализа плана выполнения запроса.
  • JSON Extended syntax — новые функции, улучшенная сортировка и частичные обновления. С табличными функциями JSON можно использовать SQL выражения для данных в JSON.
  • GIS Geography support — поддерживает теперь различные системы коордиат — Spatial Reference Systems (SRS), соответствующие типы данных, индексы и функции.
  • Выражения DDL стали атомарными и защищенными от падений, метаданные в транзакционной таблице.
  • Существенные улучшения в "наблюдаемости" системы — доработаны Performance Schema, Information Schema, Configuration Variables, и Error Logging.
  • Улучшения в удаленном администрировании, работе с откатом изменений в tablespace-ах, новые элементы DDL
  • Безопасность — перевели community edition на OpenSSL, добавили SQL-роли,
    раздробили привелегию "SUPER" на более мелкие,
  • Поменяли авторизацию по-умолчанию и усилили требования к паролям.
  • Улучшили производительность InnoDB на различных типах нагрузок.
  • Добавили Resource Group — фича, позволяющая пользователю явно раскладывать нагрузку по ядрам.
  • Починили работу булевых операций с varbinary(16) типом, что упростило работу с ipv6-адресами.

Отдельное спасибо за уточнения в комментариях — petropavel

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


  1. whykeks
    23.04.2018 10:59
    -1

    Некто?


    1. staticlab
      23.04.2018 11:09
      -2

      Заголовок спойлера

      — Предположим, что у вас в кармане два яблока. Некто взял у вас одно яблоко. Сколько у вас осталось яблок?
      — Два.
      — Подумайте хорошенько.
      Буратино сморщился, — так здорово подумал.
      — Два…
      — Почему?
      — Я же не отдам некту яблоко, хоть он дерись!


  1. webviktor
    23.04.2018 11:09

    Исправьте на «Никто».
    Сравнения в производительности с 5.7 на тяжелых запросах нет?
    Пакет для Убунту в репозитории случайно не добавили?


    1. mickvav
      23.04.2018 11:27

      В убунтовских репозиториях — нету. В Oracle-овских — должен быть. Сами .deb-пакеты на сайте есть.


  1. Gemorroj
    23.04.2018 11:31

    Ну, кто-то все-таки заметил)
    Успел 2 задачи сделать:
    https://bugs.php.net/bug.php?id=76243 в mysql8 новый механизм аутентификации по умолчанию, запрос на поддержку в php.
    https://bugs.mysql.com/bug.php?id=90529 установка в Centos из yum репозитория требует дополнительных телодвижений, чтобы корректно проинициализировались технические таблицы (схемы sys, mysql, performance_schema, information_schema)


  1. Yeah
    23.04.2018 12:00

    Странно. Я еще с год назад юзал докер-образ с восьмеркой. Думал, что она уже давно зарелизилась


    1. petropavel
      23.04.2018 13:02

      GA только сейчас. До этого был RC или бета


  1. fRoStBiT
    23.04.2018 12:07

    Выражения DDL стали атомарными и защищенными от падений, метаданные в транзакционной таблице.

    То есть в предыдущих версиях падение во время выполнения DDL может всю БД сломать?


    1. petropavel
      23.04.2018 13:05

      Ну, всю не всю, но можно было поиметь проблемы с той таблицей, которую менял этот DDL. Они, насколько я понимаю, не смертельные, все можно восстановить было, но ручками. А сейчас проблем, теоретически, быть больше не должно


      1. ohifck
        23.04.2018 16:21

        раньше структуры таблиц хранились в myisam
        то же самое что внутри транзакции сделать update на таблице без поддержки транзакционных механизмов


        1. petropavel
          23.04.2018 18:23

          Нет, раньше структуры таблиц хранились в frm файлах. Одна таблица — один файл. То есть CREATE TABLE состоял из двух этапов — 1) создать frm файл 2) создать таблицу внутри InnoDB. Если сервер падал между этими двумя этапами, сервер думал, что таблица есть, а InnoDB — что нет. Лечилось такое drop-аньем этой полу-таблицы и созданием заново.


  1. petropavel
    23.04.2018 13:08
    +1

    CTE это отнюдь не только синтаксический сахар. Главное в них — рекурсия, и это принципиально новая штука в SQL (SQL-99, если честно) позволяющая делать то, что раньше было невозможно.


    1. mickvav
      23.04.2018 13:21

      А можете дать ссылочку на какой-нибудь красивый пример, я в статью вставлю :)


      1. petropavel
        23.04.2018 13:40

        В документации есть примеры. Например, в dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions-recursive есть примеры на генерацию последовательностей (числа фибоначчи, все даты от… и до...) и на проход дерева (таблица employees с отношениями начальник-подчиненный).

        А в mariadb.com/kb/en/library/recursive-common-table-expressions-overview есть пример на граф — нахождение всех маршрутов (с пересадками) из Нью-Йорка до Роли


        1. petropavel
          23.04.2018 13:46

          Есть и более экзотические примеры (a.k.a. ненормальное программирование):

          * Решатель судоку
          * Интерпретатор Brainfuck

          С добавлением рекурсивных CTE, SQL стал полным по Тьюрингу


          1. mickvav
            23.04.2018 13:58

            Я так понимаю, CTE в других SQL-ях уже давно, это для MySQL — «наконец-то».


            1. kalininmr
              24.04.2018 02:02

              ага. очень иногда нехватает.
              хотя бы ради деревьев


  1. petropavel
    23.04.2018 13:13
    +1

    И, для полноты картины, в MariaDB CTE и оконные функции есть уже год. REGEXP_REPLACE, SQL-роли и гистограммы — четыре года. Но вот атомарных DDL, например, нет пока.


    1. mickvav
      23.04.2018 13:20
      +1

      Да тут многие вещи в RC болтались минимум год, если приглядеться.


    1. Gemorroj
      23.04.2018 13:51

      а еще check constraint есть
      зато в марии json фейковый.
      и чем дальше, тем больше они (эти две субд) будут отличаться.


      1. petropavel
        23.04.2018 14:06

        в MariaDB json стандартный. В SQL стандарте такого типа нет.
        Вообще тип — фигня, в MySQL просто медленный JSON парсер, и без бинарного json-а все ползало, а в MariaDB парсер побыстрей и ломать стандарт причины не было.

        Из реально интересных штук — JSON_TABLE в 8.0. Этого в MariaDB нет. И json partial updates тоже интересная фича.


  1. elmigranto
    23.04.2018 13:48

    Выражения DDL стали атомарными и защищенными от падений, метаданные в транзакционной таблице.
    Из доков:
    This means that DDL statements cannot be performed within another transaction, within transaction control statements such as START TRANSACTION… COMMIT, or combined with other statements within the same transaction.
    Раз менять DDL внутри транзакции по-прежнему нельзя, то, получается, команду можно поздравить разве что с тем, что фундаментальная функция БД теперь работает и больше не /dev/null.

    А есть ли какая-то информация, когда завезут поддержку CHECK вместо «парсится и молча игнорируется»?


    1. petropavel
      23.04.2018 13:50

      Ну, судя по тому, что CHECK в MariaDB есть уже год, то, наверно, скоро :)


  1. mtp
    23.04.2018 23:21

    Сразу скажу, с MySQL я довольно поверхностно знаком, несмотря на долгую эксплуатацию. Вопрос к database-админам и увлеченным программерам — вроде как обещают прирост производительности до 200%. Еще не проверяли, не тестировали на всяких сценариях? И как с совместимостью веб-приложений?

    В свое время были вдохновляющие статьи про PHP 7.0 — 1, 2, 3 с бенчмарками. Про новый MySQL бы такое увидеть.


    1. arheops
      24.04.2018 23:23

      Если вы знакомы поверхностно, то не стоит рассчитывать на прирост. Прироста на стандартном my.conf нету, все надо настраивать(количество потоков. индексы и так далее).


  1. Shannon
    24.04.2018 04:36

    Для меня самое главное в innodb таблицах наконец-то сохраняется значение максимального авто-инкремента даже при удалении записей или перезагрузках базы
    А то до этого как не старайся настроить, всё равно в разреженной таблице база пыталась писать по уже существующим id из-за чего было много не уловимых багов


    1. oxidmod
      24.04.2018 11:37

      А может не использовать автоинкременты? =)


  1. coalesce
    24.04.2018 09:30

    На всякий случай рекомендую проверить пофиксили ли баг
    https://toster.ru/q/471767


  1. Introducer
    25.04.2018 15:37

    >>Выражения DDL стали атомарными и защищенными от падений, метаданные в транзакционной таблице.
    Это значит что можно накатывать пачку изменений на структуру БД в одной транзакции и при ошибке все скопом отменять rollback-ом?


    1. mickvav Автор
      25.04.2018 15:38

      Похоже на то, но я бы не отказывался от тестового стенда в связи с этим :)


    1. petropavel
      25.04.2018 16:44

      Нет. Это только означает, что если сервер упадёт во время DDL, то после нового старта или DDL будет доделан до конца, или полностью отменён.

      До 8.0 могли оставаться артефакты, которые надо было убирать вручную.