Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Что нового в MySQL 8.0? / Дмитрий Ленев (Oracle)

3,834 views

Published on

РИТ++ 2017, Backend Conf
Зал Сан-Паулу, 6 июня, 16:00

Тезисы:
http://backendconf.ru/2017/abstracts/2801.html

8.0 - это следующая крупная версия СУБД MySQL Server, которая на данный момент находится в активной разработке. Цель данного доклада - познакомить слушателей с новыми возможностями и улучшениями производительности,которые реализованы в этой версии.

В частности, мы поговорим о:
- новом словаре данных, связанных с ним изменениях в INFORMATION_SCHEMA, а также поддержке атомарного DDL;
- новых возможностях в выполнении запросов - поддержке Common Table Expressions и Window функций, "невидимых" и descending индексах;
- улучшениях в поддержке Unicode;
- возможностях более гибкой работы с блокировками в запросах (SKIP LOCKED/NOWAIT);
- ролях и других изменениях в системе привилегий;
- улучшениях в репликации.

Published in: Engineering
  • Be the first to comment

Что нового в MySQL 8.0? / Дмитрий Ленев (Oracle)

  1. 1. Что нового в MySQL 8.0? Дмитрий Ленев, Oracle/MySQL Москва, Июнь 2017
  2. 2. Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release and timing of any features or functionality described for Oracle's products remains at the sole discretion of Oracle.
  3. 3. Актуальные версии MySQL ● 5.7 - cтабильная ветка – Свежая версия - 5.7.18 (2017-04-10) – Доступны на dev.mysql.com/downloads/mysql/ ● 8.0 – активная разработка – Development Milestone Release - 8.0.1 (2017-04-10) – Доступны там же ● MySQL Labs версии – 8.0.1 + unified data-dictionary (2017-04-21) – Доступны на labs.mysql.com/ ● Rapid плагины – X (с 5.7.12), Group Replication (с 5.7.17) – Распространяются вместе со стабильными или DMR версиями
  4. 4. Актуальные версии MySQL ● 5.7 - cтабильная ветка – Свежая версия - 5.7.18 (2017-04-10) – Доступны на dev.mysql.com/downloads/mysql/ ● 8.0 – активная разработка – Development Milestone Release - 8.0.1 (2017-04-10) – Доступны там же ● MySQL Labs версии – 8.0.1 + unified data-dictionary (2017-04-21) – Доступны на labs.mysql.com/ ● Rapid плагины – X (с 5.7.12), Group Replication (с 5.7.17) – Распространяются вместе со стабильными или DMR версиями
  5. 5. Актуальные версии MySQL ● 5.7 - cтабильная ветка – Свежая версия - 5.7.18 (2017-04-10) – Доступны на dev.mysql.com/downloads/mysql/ ● 8.0 – активная разработка – Development Milestone Release - 8.0.1 (2017-04-10) – Доступны там же ● MySQL Labs версии – 8.0.1 + unified data-dictionary (2017-04-21) – Доступны на labs.mysql.com/ ● Rapid плагины – X (с 5.7.12), Group Replication (с 5.7.17) – Распространяются вместе со стабильными или DMR версиями
  6. 6. Актуальные версии MySQL ● 5.7 - cтабильная ветка – Свежая версия - 5.7.18 (2017-04-10) – Доступны на dev.mysql.com/downloads/mysql/ ● 8.0 – активная разработка – Development Milestone Release - 8.0.1 (2017-04-10) – Доступны там же ● MySQL Labs версии – 8.0.1 + unified data-dictionary (2017-04-21) – Доступны на labs.mysql.com/ ● Rapid плагины – X (с 5.7.12), Group Replication (с 5.7.17) – Распространяются вместе со стабильными или DMR версиями
  7. 7. MySQL 8.0 с высоты птичьего полета ● Новый словарь данных и поддержка атомарного DDL ● Табличные выражения (CTE), оконные функции ● Убывающие и невидимые индексы ● Улучшения в поддержке Unicode ● Гибкая работа с блокировками (SKIP LOCKED/NO WAIT) ● Роли, улучшения в системе привилегий ● Улучшения в репликации
  8. 8. Словарь данных до 8.0: Метаданные хранятся в разных местах Словарь данных Файлы FRM TRG OPT Таблицы (mysql.*) user procevents Таблицы (innodb.sys) MyISAM File system InnoDB S Q L
  9. 9. Словарь данных до 8.0: Проблемы ● INFORMATION_SCHEMA медленная ● Конфликты из-за нетранзакционного хранения МД ● Конфликты между МД в InnoDB и в ядре сервера ● Трудно реализовать атомарный и транзакционный DDL ● Проблемы с репликацией неатомарного DDL ● Сложно расширять
  10. 10. Словарь данных до 8.0: Проблемы ● INFORMATION_SCHEMA медленная ● Конфликты из-за нетранзакционного хранения МД ● Конфликты между МД в InnoDB и в ядре сервера ● Трудно реализовать атомарный и транзакционный DDL ● Проблемы с репликацией неатомарного DDL ● Сложно расширять
  11. 11. Словарь данных до 8.0: Проблемы ● INFORMATION_SCHEMA медленная ● Конфликты из-за нетранзакционного хранения МД ● Конфликты между МД в InnoDB и в ядре сервера ● Трудно реализовать атомарный и транзакционный DDL ● Проблемы с репликацией неатомарного DDL ● Сложно расширять
  12. 12. Словарь данных до 8.0: Проблемы ● INFORMATION_SCHEMA медленная ● Конфликты из-за нетранзакционного хранения МД ● Конфликты между МД в InnoDB и в ядре сервера ● Трудно реализовать атомарный и транзакционный DDL ● Проблемы с репликацией неатомарного DDL ● Сложно расширять
  13. 13. Словарь данных до 8.0: Проблемы ● INFORMATION_SCHEMA медленная ● Конфликты из-за нетранзакционного хранения МД ● Конфликты между МД в InnoDB и в ядре сервера ● Трудно реализовать атомарный и транзакционный DDL ● Проблемы с репликацией неатомарного DDL ● Сложно расширять
  14. 14. Словарь данных до 8.0: Проблемы ● INFORMATION_SCHEMA медленная ● Конфликты из-за нетранзакционного хранения МД ● Конфликты между МД в InnoDB и в ядре сервера ● Трудно реализовать атомарный и транзакционный DDL ● Проблемы с репликацией неатомарного DDL ● Сложно расширять
  15. 15. Словарь данных до 8.0: Проблемы ● INFORMATION_SCHEMA медленная ● Конфликты из-за нетранзакционного хранения МД ● Конфликты между МД в InnoDB и в ядре сервера ● Трудно реализовать атомарный и транзакционный DDL ● Проблемы с репликацией неатомарного DDL ● Сложно расширять
  16. 16. Новый словарь данных ● Единое хранилище для всех метаданных – таблицы – Транзакционность – INFORMATION_SCHEMA – просто представления ● Единое API для ядра сервера, SE и плагинов ● Единообразное API для разных объектов ● Расширяемость – Продуман upgrade – Поддержка плагинов ● Поддержка disaster recovery (SDI)
  17. 17. Новый словарь данных ● Единое хранилище для всех метаданных – таблицы – Транзакционность – INFORMATION_SCHEMA – просто представления ● Единое API для ядра сервера, SE и плагинов ● Единообразное API для разных объектов ● Расширяемость – Продуман upgrade – Поддержка плагинов ● Поддержка disaster recovery (SDI)
  18. 18. Новый словарь данных ● Единое хранилище для всех метаданных – таблицы – Транзакционность – INFORMATION_SCHEMA – просто представления ● Единое API для ядра сервера, SE и плагинов ● Единообразное API для разных объектов ● Расширяемость – Продуман upgrade – Поддержка плагинов ● Поддержка disaster recovery (SDI)
  19. 19. Новый словарь данных ● Единое хранилище для всех метаданных – таблицы – Транзакционность – INFORMATION_SCHEMA – просто представления ● Единое API для ядра сервера, SE и плагинов ● Единообразное API для разных объектов ● Расширяемость – Продуман upgrade – Поддержка плагинов ● Поддержка disaster recovery (SDI)
  20. 20. Новый словарь данных ● Единое хранилище для всех метаданных – таблицы – Транзакционность – INFORMATION_SCHEMA – просто представления ● Единое API для ядра сервера, SE и плагинов ● Единообразное API для разных объектов ● Расширяемость – Продуман upgrade – Поддержка плагинов ● Поддержка disaster recovery (SDI)
  21. 21. Новый словарь данных ● Единое хранилище для всех метаданных – таблицы – Транзакционность – INFORMATION_SCHEMA – просто представления ● Единое API для ядра сервера, SE и плагинов ● Единообразное API для разных объектов ● Расширяемость – Продуман upgrade – Поддержка плагинов ● Поддержка disaster recovery (SDI)
  22. 22. INFORMATION_SCHEMA в 5.7 Клиент Запрос к I_S Результаты Сервер MySQL . ФС / MyISAM / InnoDB SE
  23. 23. INFORMATION_SCHEMA в 5.7 Клиент Запрос к I_S Результаты Сервер MySQL Создание временной таблицы . Временная таблица ФС / MyISAM / InnoDB SE
  24. 24. INFORMATION_SCHEMA в 5.7 Клиент Запрос к I_S Результаты Сервер MySQL Создание временной таблицы . Временная таблица ФС / MyISAM / InnoDB SE Оптимизатор готовит план запроса.
  25. 25. INFORMATION_SCHEMA в 5.7 Клиент Запрос к I_S Результаты Сервер MySQL Создание временной таблицы . Временная таблица ФС / MyISAM / InnoDB SE Оптимизатор готовит план запроса. План выполняется, заполняются временные таблицы, читаются строки из временных таблиц.
  26. 26. INFORMATION_SCHEMA в 5.7 Клиент Запрос к I_S Результаты Сервер MySQL Создание временной таблицы Эвристики Чтение метаданных с ФС или MyISAM/ InnoDB. . Временная таблица ФС / MyISAM / InnoDB SE Оптимизатор готовит план запроса. План выполняется, заполняются временные таблицы, читаются строки из временных таблиц.
  27. 27. INFORMATION_SCHEMA в 5.7 Клиент Запрос к I_S Результаты Сервер MySQL Создание временной таблицы Эвристики Чтение метаданных с ФС или MyISAM/ InnoDB. . Временная таблица ФС / MyISAM / InnoDB SE Оптимизатор готовит план запроса. План выполняется, заполняются временные таблицы, читаются строки из временных таблиц.
  28. 28. INFORMATION_SCHEMA в 5.7 Клиент Запрос к I_S Результаты Сервер MySQL Создание временной таблицы Эвристики Чтение метаданных с ФС или MyISAM/ InnoDB. . Временная таблица Возвращаем строки пользователю. ФС / MyISAM / InnoDB SE Оптимизатор готовит план запроса. План выполняется, заполняются временные таблицы, читаются строки из временных таблиц.
  29. 29. INFORMATION_SCHEMA в 5.7 Клиент Запрос к I_S Результаты Сервер MySQL Создание временной таблицы Эвристики Чтение метаданных с ФС или MyISAM/ InnoDB. . Временная таблица Возвращаем строки пользователю. ФС / MyISAM / InnoDB SE Оптимизатор готовит план запроса. План выполняется, заполняются временные таблицы, читаются строки из временных таблиц.
  30. 30. INFORMATION_SCHEMA в 8.0 Клиент Запрос к I_S Результаты Сервер MySQL . InnoDB SE
  31. 31. INFORMATION_SCHEMA в 8.0 Клиент Запрос к I_S Результаты Сервер MySQL . InnoDB SE Оптимизатор готовит план запроса.
  32. 32. INFORMATION_SCHEMA в 8.0 Клиент Запрос к I_S Результаты Сервер MySQL . InnoDB SE Оптимизатор готовит план запроса. План выполняется, читаются строки из таблиц СД.
  33. 33. INFORMATION_SCHEMA в 8.0 Клиент Запрос к I_S Результаты Сервер MySQL . Возвращаем строки пользователю. InnoDB SE Оптимизатор готовит план запроса. План выполняется, читаются строки из таблиц СД.
  34. 34. Время выполнения запросов к INFORMATION_SCHEMA в 8.0 (секунды, 100 БД по 50 таблиц) Schema aggregate size stats All Dynamic Table Info All Static Table Info Auto Increments Near Limit Count All Columns Count All Indexes 0 1 2 3 4 MySQL 8.0 MySQL 5.7
  35. 35. Атомарный DDL ● Семантика все или ничего при ошибках – Лучше соотвествует ожиданиям пользователей – Проще реплицировать ● Согласованность информации при падении сервера – Словарь данных – SE – Binary log ● Нужна поддержка в SE (InnoDB, NDB) В разработке
  36. 36. Атомарный DDL ● Семантика все или ничего при ошибках – Лучше соотвествует ожиданиям пользователей – Проще реплицировать ● Согласованность информации при падении сервера – Словарь данных – SE – Binary log ● Нужна поддержка в SE (InnoDB, NDB) В разработке
  37. 37. Атомарный DDL ● Семантика все или ничего при ошибках – Лучше соотвествует ожиданиям пользователей – Проще реплицировать ● Согласованность информации при падении сервера – Словарь данных – SE – Binary log ● Нужна поддержка в SE (InnoDB, NDB) В разработке
  38. 38. Атомарный DDL ● Семантика все или ничего при ошибках – Лучше соотвествует ожиданиям пользователей – Проще реплицировать ● Согласованность информации при падении сервера – Словарь данных – SE – Binary log ● Нужна поддержка в SE (InnoDB, NDB) В разработке
  39. 39. Работа с иерархическими данными до 8.0: Модель списка соседей Проблемы: ● Проблемы с высотой дерева ● Приходится писать процедуры 1 : Alice 2 : Bob 3 : Colin 4 : Dag 5 : Eve 1 1 2 2 ID NAME MANAGER_ID 1 Alice NULL 2 Bob 1 3 Colin 1 4 Dag 2 5 Eve 2
  40. 40. Работа с иерархическими данными до 8.0: Модель списка соседей Проблемы: ● Проблемы с высотой дерева ● Приходится писать процедуры 1 : Alice 2 : Bob 3 : Colin 4 : Dag 5 : Eve 1 1 2 2 ID NAME MANAGER_ID 1 Alice NULL 2 Bob 1 3 Colin 1 4 Dag 2 5 Eve 2
  41. 41. Работа с иерархическими данными до 8.0: Модель вложенных множеств Проблемы: ● Нетривиальная реализация ● Сложные вставка и удаление Electronics TVs Consoles LCD Plasma 1 8 3 7 NAME LFT RGT Electronics 1 10 TVs 2 7 Consoles 8 9 LCD 3 4 Plasma 5 6 4 2 5 6 9 10
  42. 42. Работа с иерархическими данными до 8.0: Модель вложенных множеств Проблемы: ● Нетривиальная реализация ● Сложные вставка и удаление Electronics TVs Consoles LCD Plasma 1 8 3 7 NAME LFT RGT Electronics 1 10 TVs 2 7 Consoles 8 9 LCD 3 4 Plasma 5 6 4 2 5 6 9 10
  43. 43. Работа с иерархическими данными в 8.0: Рекурсивные табличные выражения WITH RECURSIVE employee_levels (id, name, level) AS ( SELECT id, name, 0 FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, el.level + 1 FROM employee_levels AS el JOIN employees AS e ON el.id = e.manager_id ) SELECT * FROM employee_leves ORDER BY level;
  44. 44. Работа с иерархическими данными в 8.0: Рекурсивные табличные выражения WITH RECURSIVE employee_levels (id, name, level) AS ( SELECT id, name, 0 FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, el.level + 1 FROM employee_levels AS el JOIN employees AS e ON el.id = e.manager_id ) SELECT * FROM employee_levels ORDER BY level;
  45. 45. Работа с иерархическими данными в 8.0: Рекурсивные табличные выражения WITH RECURSIVE employee_levels (id, name, level) AS ( SELECT id, name, 0 FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, el.level + 1 FROM employee_levels AS el JOIN employees AS e ON el.id = e.manager_id ) SELECT * FROM employee_levels ORDER BY level;
  46. 46. Работа с иерархическими данными в 8.0: Рекурсивные табличные выражения WITH RECURSIVE employee_levels (id, name, level) AS ( SELECT id, name, 0 FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, el.level + 1 FROM employee_levels AS el JOIN employees AS e ON el.id = e.manager_id ) SELECT * FROM employee_levels ORDER BY level;
  47. 47. Работа с иерархическими данными в 8.0: Рекурсивные табличные выражения WITH RECURSIVE employee_levels (id, name, level) AS ( SELECT id, name, 0 FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, el.level + 1 FROM employee_levels AS el JOIN employees AS e ON el.id = e.manager_id ) SELECT * FROM employee_levels ORDER BY level;
  48. 48. Табличные выражения: не только рекурсия! SELECT s.name, r.total_revenue FROM supplier AS s, revenue0 AS r WHERE s.id = r.supplier_id AND r.total_revenue = (SELECT MAX(total_revenue) FROM revenue0) ORDER BY s.name;
  49. 49. Табличные выражения: не только рекурсия! SELECT s.name, r.total_revenue FROM supplier AS s, revenue0 AS r WHERE s.id = r.supplier_id AND r.total_revenue = (SELECT MAX(total_revenue) FROM revenue0) ORDER BY s.name; CREATE VIEW revenue0 AS SELECT supplier_id, SUM(item_price * items) AS total_revenue FROM orders WHERE … GROUP BY supplier_id;
  50. 50. Табличные выражения: не только рекурсия! SELECT s.name, r.total_revenue FROM supplier AS s, revenue0 AS r WHERE s.id = r.supplier_id AND r.total_revenue = (SELECT MAX(total_revenue) FROM revenue0) ORDER BY s.name; WITH revenue0(supplier_id , total_revenue) AS ( SELECT supplier_id, SUM(item_price * items) FROM orders ... GROUP BY supplier_id ) SELECT s.name, r.total_revenue FROM supplier AS s, revenue0 AS r WHERE s.id = r.supplier_id AND r.total_revenue = (SELECT MAX(total_revenue) FROM revenue0) ORDER BY s.name;
  51. 51. Табличные выражения: не только рекурсия! SELECT s.name, r.total_revenue FROM supplier AS s, revenue0 AS r WHERE s.id = r.supplier_id AND r.total_revenue = (SELECT MAX(total_revenue) FROM revenue0) ORDER BY s.name; WITH revenue0(supplier_id , total_revenue) AS ( SELECT supplier_id, SUM(item_price * items) FROM orders ... GROUP BY supplier_id ) SELECT s.name, r.total_revenue FROM supplier AS s, revenue0 AS r WHERE s.id = r.supplier_id AND r.total_revenue = (SELECT MAX(total_revenue) FROM revenue0) ORDER BY s.name;
  52. 52. Оконные функции Проблема: ● До версии 8.0 сложно и иногда невозможно считать агрегатные функции от группы из текущей и связанных с нею строк (окна) без группировки всех строк в группе. Решение: ● Оконные функции
  53. 53. Оконные функции Проблема: ● До версии 8.0 сложно и иногда невозможно считать агрегатные функции от группы из текущей и связанных с нею строк (окна) без группировки всех строк в группе. Решение: ● Оконные функции
  54. 54. Оконные функции: пример SELECT e.name, d.name AS dep_name, salary, RANK() OVER (PARTITION BY d.id ORDER BY salary DESC) rank_in_dep FROM employees e, departments d WHERE e.department = d.id ORDER BY e.name; NAME DEP_NAME SALARY RANK_IN_DEP Alice B 50000 1 Donald A 20000 2 Ingrid B 40000 2 Mary A 15000 3 Sebastian B 40000 2 William A 30000 1 В разработке
  55. 55. Оконные функции: пример SELECT e.name, d.name AS dep_name, salary, RANK() OVER (PARTITION BY d.id ORDER BY salary DESC) rank_in_dep FROM employees e, departments d WHERE e.department = d.id ORDER BY e.name; NAME DEP_NAME SALARY RANK_IN_DEP Alice B 50000 1 Donald A 20000 2 Ingrid B 40000 2 Mary A 15000 3 Sebastian B 40000 2 William A 30000 1 В разработке
  56. 56. Оконные функции: пример SELECT e.name, d.name AS dep_name, salary, RANK() OVER (PARTITION BY d.id ORDER BY salary DESC) rank_in_dep FROM employees e, departments d WHERE e.department = d.id ORDER BY e.name; NAME DEP_NAME SALARY RANK_IN_DEP Alice B 50000 1 Donald A 20000 2 Ingrid B 40000 2 Mary A 15000 3 Sebastian B 40000 2 William A 30000 1 В разработке
  57. 57. Убывающие индексы до 8.0 ● Поддержка синтаксиса ● Создается обычный возрастающий индекс ● Проблемы: – Сканирование в обратном порядке дороже – Нельзя использовать индекс когда нужно разное направление обхода по разным колонкам индекса
  58. 58. Убывающие индексы до 8.0 ● Поддержка синтаксиса ● Создается обычный возрастающий индекс ● Проблемы: – Сканирование в обратном порядке дороже – Нельзя использовать индекс когда нужно разное направление обхода по разным колонкам индекса
  59. 59. Убывающие индексы в 8.0 ● Поддерживаются InnoDB ● Оптимизатор умеет их правильно использовать – Есть ограничения на оптимизации CREATE TABLE t (c1 INT, c2 INT, INDEX idx1 (c1 ASC, c2 DESC)); SELECT … ORDER BY c1 ASC, c2 DESC; # без filesort
  60. 60. Убывающие индексы в 8.0 ● Поддерживаются InnoDB ● Оптимизатор умеет их правильно использовать – Есть ограничения на оптимизации CREATE TABLE t (c1 INT, c2 INT, INDEX idx1 (c1 ASC, c2 DESC)); SELECT … ORDER BY c1 ASC, c2 DESC; # без filesort
  61. 61. Невидимые индексы Что это такое ? ● Невидимы для оптимизатора ● Но обновляются DML (сравните с DISABLED индексами) Нужно для: ● “Удаление” индексов с мгновенным восстановлением ● Пошаговое добавление индексов
  62. 62. Невидимые индексы Что это такое ? ● Невидимы для оптимизатора ● Но обновляются DML (сравните с DISABLED индексами) Нужно для: ● “Удаление” индексов с мгновенным восстановлением ● Пошаговое добавление индексов
  63. 63. Невидимые индексы: пример ● Думаем что индекс не используется: ALTER TABLE country ALTER INDEX c INVISIBLE; ● Ошиблись! Быстро возвращаем индекс назад: ALTER TABLE country ALTER INDEX c VISIBLE; ● Все верно. Можно удалить индекс: ALTER TABLE country DROP INDEX c;
  64. 64. Невидимые индексы: пример ● Думаем что индекс не используется: ALTER TABLE country ALTER INDEX c INVISIBLE; ● Ошиблись! Быстро возвращаем индекс назад: ALTER TABLE country ALTER INDEX c VISIBLE; ● Все верно. Можно удалить индекс: ALTER TABLE country DROP INDEX c;
  65. 65. Невидимые индексы: пример ● Думаем что индекс не используется: ALTER TABLE country ALTER INDEX c INVISIBLE; ● Ошиблись! Быстро возвращаем индекс назад: ALTER TABLE country ALTER INDEX c VISIBLE; ● Все верно. Можно удалить индекс: ALTER TABLE country DROP INDEX c;
  66. 66. Unicode ● Utf8mb4 – по умолчанию в 8.0! ● Поддержка Unicode 9.0 ● Новые accent-sensitive и case-sensitive collation ● Collation специфичные для различных языков – В том числе для японского! ● Оптимизация производительности utf8mb4 – Самой реализации – Сортировки ключей переменной длины
  67. 67. Unicode ● Utf8mb4 – по умолчанию в 8.0! ● Поддержка Unicode 9.0 ● Новые accent-sensitive и case-sensitive collation ● Collation специфичные для различных языков – В том числе для японского! ● Оптимизация производительности utf8mb4 – Самой реализации – Сортировки ключей переменной длины
  68. 68. Unicode ● Utf8mb4 – по умолчанию в 8.0! ● Поддержка Unicode 9.0 ● Новые accent-sensitive и case-sensitive collation ● Collation специфичные для различных языков – В том числе для японского! ● Оптимизация производительности utf8mb4 – Самой реализации – Сортировки ключей переменной длины
  69. 69. Unicode ● Utf8mb4 – по умолчанию в 8.0! ● Поддержка Unicode 9.0 ● Новые accent-sensitive и case-sensitive collation ● Collation специфичные для различных языков – В том числе для японского! ● Оптимизация производительности utf8mb4 – Самой реализации – Сортировки ключей переменной длины
  70. 70. Unicode ● Utf8mb4 – по умолчанию в 8.0! ● Поддержка Unicode 9.0 ● Новые accent-sensitive и case-sensitive collation ● Collation специфичные для различных языков – В том числе для японского! ● Оптимизация производительности utf8mb4 – Самой реализации – Сортировки ключей переменной длины
  71. 71. Unicode ● Utf8mb4 – по умолчанию в 8.0! ● Поддержка Unicode 9.0 ● Новые accent-sensitive и case-sensitive collation ● Collation специфичные для различных языков – В том числе для японского! ● Оптимизация производительности utf8mb4 – Самой реализации – Сортировки ключей переменной длины
  72. 72. Оптимизация utf8mb4: 8.0 vs 5.7 8 16 64 128 512 1024 0 10000 20000 30000 40000 +300-350% в OLTP RO
  73. 73. Оптимизация utf8mb4: 8.0 vs 5.7 8 16 64 128 512 1024 0 10000 20000 30000 40000 8 16 64 128 512 1024 0 7500 15000 22500 30000 +300-350% в OLTP RO +176-233% в OLTP RW
  74. 74. Оптимизация utf8mb4: 8.0 vs 5.7 8 16 64 128 512 1024 0 10000 20000 30000 40000 8 16 64 128 512 1024 0 7500 15000 22500 30000 +300-350% в OLTP RO +176-233% в OLTP RW +1500-1800% в SELECT_DISTINCT_RANGES 8 16 64 128 512 1024 0 45000 90000 135000 180000
  75. 75. Гибкая работа с блокировками Проблема: Хочется пропускать заблокированные строки: – Выборка из таблицы заданий – Резервирование ресурса Решение: SELECT … FOR UPDATE SKIP LOCKED;
  76. 76. Гибкая работа с блокировками Проблема: Хочется пропускать заблокированные строки: – Выборка из таблицы заданий – Резервирование ресурса Решение: SELECT … FOR UPDATE SKIP LOCKED;
  77. 77. Гибкая работа с блокировками Проблема: Хочется пропускать заблокированные строки: – Выборка из таблицы заданий – Резервирование ресурса Решение: SELECT … FOR UPDATE SKIP LOCKED;
  78. 78. Гибкая работа с блокировками (детали) ● SKIP LOCKED – пропустить заблокированные строки ● Используется совместно с: – FOR UPDATE – FOR SHARE (замена LOCK IN SHARE MODE) ● FOR UPDATE OF <table_name> SKIP LOCKED ● NOWAIT – выдать ошибку вместо ожидания
  79. 79. Гибкая работа с блокировками (детали) ● SKIP LOCKED – пропустить заблокированные строки ● Используется совместно с: – FOR UPDATE – FOR SHARE (замена LOCK IN SHARE MODE) ● FOR UPDATE OF <table_name> SKIP LOCKED ● NOWAIT – выдать ошибку вместо ожидания
  80. 80. Гибкая работа с блокировками (детали) ● SKIP LOCKED – пропустить заблокированные строки ● Используется совместно с: – FOR UPDATE – FOR SHARE (замена LOCK IN SHARE MODE) ● FOR UPDATE OF <table_name> SKIP LOCKED ● NOWAIT – выдать ошибку вместо ожидания
  81. 81. Гибкая работа с блокировками (детали) ● SKIP LOCKED – пропустить заблокированные строки ● Используется совместно с: – FOR UPDATE – FOR SHARE (замена LOCK IN SHARE MODE) ● FOR UPDATE OF <table_name> SKIP LOCKED ● NOWAIT – выдать ошибку вместо ожидания
  82. 82. Роли ● Именованные коллекции привилегий – Могут включать другие роли ● Упрощают управление привилегиями пользователей – Проще структура привилегий – Легко добавлять и отбирать привилегии ● Можно активировать/деактивировать для сессии ● Можно назначить несколько активных ролей по умолчанию ● ROLES_GRAPHML()
  83. 83. Роли ● Именованные коллекции привилегий – Могут включать другие роли ● Упрощают управление привилегиями пользователей – Проще структура привилегий – Легко добавлять и отбирать привилегии ● Можно активировать/деактивировать для сессии ● Можно назначить несколько активных ролей по умолчанию ● ROLES_GRAPHML()
  84. 84. Роли ● Именованные коллекции привилегий – Могут включать другие роли ● Упрощают управление привилегиями пользователей – Проще структура привилегий – Легко добавлять и отбирать привилегии ● Можно активировать/деактивировать для сессии ● Можно назначить несколько активных ролей по умолчанию ● ROLES_GRAPHML()
  85. 85. Роли ● Именованные коллекции привилегий – Могут включать другие роли ● Упрощают управление привилегиями пользователей – Проще структура привилегий – Легко добавлять и отбирать привилегии ● Можно активировать/деактивировать для сессии ● Можно назначить несколько активных ролей по умолчанию ● ROLES_GRAPHML()
  86. 86. Роли ● Именованные коллекции привилегий – Могут включать другие роли ● Упрощают управление привилегиями пользователей – Проще структура привилегий – Легко добавлять и отбирать привилегии ● Можно активировать/деактивировать для сессии ● Можно назначить несколько активных ролей по умолчанию ● ROLES_GRAPHML()
  87. 87. Роли ● Именованные коллекции привилегий – Могут включать другие роли ● Упрощают управление привилегиями пользователей – Проще структура привилегий – Легко добавлять и отбирать привилегии ● Можно активировать/деактивировать для сессии ● Можно назначить несколько активных ролей по умолчанию ● ROLES_GRAPHML()
  88. 88. Роли: пример CREATE ROLE 'dev', 'reader'; GRANT ALL ON db.* TO 'dev'; GRANT SELECT ON db.* TO 'reader'; GRANT 'dev' TO 'alice'@'localhost'; GRANT 'reader' TO 'alice'@'localhost'; GRANT 'reader' TO 'bob'@'localhost'; SET ROLE 'dev'; SET DEFAULT ROLE ALL TO 'alice'@'localhost';
  89. 89. Роли: пример CREATE ROLE 'dev', 'reader'; GRANT ALL ON db.* TO 'dev'; GRANT SELECT ON db.* TO 'reader'; GRANT 'dev' TO 'alice'@'localhost'; GRANT 'reader' TO 'alice'@'localhost'; GRANT 'reader' TO 'bob'@'localhost'; SET ROLE 'dev'; SET DEFAULT ROLE ALL TO 'alice'@'localhost';
  90. 90. Роли: пример CREATE ROLE 'dev', 'reader'; GRANT ALL ON db.* TO 'dev'; GRANT SELECT ON db.* TO 'reader'; GRANT 'dev' TO 'alice'@'localhost'; GRANT 'reader' TO 'alice'@'localhost'; GRANT 'reader' TO 'bob'@'localhost'; SET ROLE 'dev'; SET DEFAULT ROLE ALL TO 'alice'@'localhost';
  91. 91. Роли: пример CREATE ROLE 'dev', 'reader'; GRANT ALL ON db.* TO 'dev'; GRANT SELECT ON db.* TO 'reader'; GRANT 'dev' TO 'alice'@'localhost'; GRANT 'reader' TO 'alice'@'localhost'; GRANT 'reader' TO 'bob'@'localhost'; SET ROLE 'dev'; SET DEFAULT ROLE ALL TO 'alice'@'localhost';
  92. 92. Роли: пример CREATE ROLE 'dev', 'reader'; GRANT ALL ON db.* TO 'dev'; GRANT SELECT ON db.* TO 'reader'; GRANT 'dev' TO 'alice'@'localhost'; GRANT 'reader' TO 'alice'@'localhost'; GRANT 'reader' TO 'bob'@'localhost'; SET ROLE 'dev'; SET DEFAULT ROLE ALL TO 'alice'@'localhost';
  93. 93. Динамические привилегии Проблема: SUPER привилегия перегружена Решение: Динамические привилегии ● Глобального уровня ● Замена SUPER: AUDIT_ADMIN, BINLOG_ADMIN, CONNECTION_ADMIN, ENCRYPTION_KEY_ADMIN, FIREWALL_ADMIN,... ● Изначально привилегии добавляемые плагинами
  94. 94. Динамические привилегии Проблема: SUPER привилегия перегружена Решение: Динамические привилегии ● Глобального уровня ● Замена SUPER: AUDIT_ADMIN, BINLOG_ADMIN, CONNECTION_ADMIN, ENCRYPTION_KEY_ADMIN, FIREWALL_ADMIN,... ● Изначально привилегии добавляемые плагинами
  95. 95. Динамические привилегии Проблема: SUPER привилегия перегружена Решение: Динамические привилегии ● Глобального уровня ● Замена SUPER: AUDIT_ADMIN, BINLOG_ADMIN, CONNECTION_ADMIN, ENCRYPTION_KEY_ADMIN, FIREWALL_ADMIN,... ● Изначально привилегии добавляемые плагинами
  96. 96. Динамические привилегии Проблема: SUPER привилегия перегружена Решение: Динамические привилегии ● Глобального уровня ● Замена SUPER: AUDIT_ADMIN, BINLOG_ADMIN, CONNECTION_ADMIN, ENCRYPTION_KEY_ADMIN, FIREWALL_ADMIN,... ● Изначально привилегии добавляемые плагинами
  97. 97. Репликация: оптимизация взаимодействия между I/O и SQL потоками Проблема: Репликация отстает или неэффективна Решение: Вынести запись и чтение в/из relay log из критических секций Меньше держим блокировки Потоки ждут доступа к relay log меньше Выше производительность
  98. 98. Репликация: оптимизация взаимодействия между I/O и SQL потоками Проблема: Репликация отстает или неэффективна Решение: Вынести запись и чтение в/из relay log из критических секций Меньше держим блокировки Потоки ждут доступа к relay log меньше Выше производительность
  99. 99. Репликация: оптимизация взаимодействия между I/O и SQL потоками Проблема: Репликация отстает или неэффективна Решение: Вынести запись и чтение в/из relay log из критических секций Меньше держим блокировки Потоки ждут доступа к relay log меньше Выше производительность
  100. 100. Результаты оптимизации взаимодействия между I/O и SQL потоками (Sysbench Update Indexed: применение транзакций/сек на реплике, RBR) 16 потоков 64 потоков 0 5000 10000 15000 20000 25000 30000 35000 40000 45000 MySQL 8.0.0 MySQL 8.0.1 Durable настройки для binlog
  101. 101. Результаты оптимизации взаимодействия между I/O и SQL потоками (Sysbench Update Indexed: применение транзакций/сек на реплике, RBR) 16 потоков 64 потоков 16 потоков 64 потоков 0 5000 10000 15000 20000 25000 30000 35000 40000 45000 MySQL 8.0.0 MySQL 8.0.1 Durable настройки для binlog Non-durable настройки для binlog
  102. 102. Репликация: параллелизм на основе использования write-set Проблема: ● Репликация отстает или неэффективна ● Параллельная репликация на основе логических временных меток не помогает – Малое число или одно соединение на мастере – Сложная топология приводит к потере параллелизма Решение: ● Использовать параллелизм на основе write-set транзакций
  103. 103. Репликация: параллелизм на основе использования write-set Проблема: ● Репликация отстает или неэффективна ● Параллельная репликация на основе логических временных меток не помогает – Малое число или одно соединение на мастере – Сложная топология приводит к потере параллелизма Решение: ● Использовать параллелизм на основе write-set транзакций
  104. 104. Репликация: параллелизм на основе использования write-set Проблема: ● Репликация отстает или неэффективна ● Параллельная репликация на основе логических временных меток не помогает – Малое число или одно соединение на мастере – Сложная топология приводит к потере параллелизма Решение: ● Использовать параллелизм на основе write-set транзакций
  105. 105. Репликация: параллелизм на основе использования write-set ● Write-set транзакции – множество строк измененных транзакцией ● Write-set – средство обнаружить завимости ● Транзакции с непересекающимися write-set можно применять паралелльно ● Параллелизм на основе write-set расширяет механизм на основе логических временных меток ● Зависимости определяются на мастере и выражаются при помощи логических временных меток в binary log
  106. 106. Репликация: параллелизм на основе использования write-set ● Write-set транзакции – множество строк измененных транзакцией ● Write-set – средство обнаружить завимости ● Транзакции с непересекающимися write-set можно применять паралелльно ● Параллелизм на основе write-set расширяет механизм на основе логических временных меток ● Зависимости определяются на мастере и выражаются при помощи логических временных меток в binary log
  107. 107. Репликация: параллелизм на основе использования write-set ● Write-set транзакции – множество строк измененных транзакцией ● Write-set – средство обнаружить завимости ● Транзакции с непересекающимися write-set можно применять паралелльно ● Параллелизм на основе write-set расширяет механизм на основе логических временных меток ● Зависимости определяются на мастере и выражаются при помощи логических временных меток в binary log
  108. 108. Репликация: параллелизм на основе использования write-set ● Write-set транзакции – множество строк измененных транзакцией ● Write-set – средство обнаружить завимости ● Транзакции с непересекающимися write-set можно применять паралелльно ● Параллелизм на основе write-set расширяет механизм на основе логических временных меток ● Зависимости определяются на мастере и выражаются при помощи логических временных меток в binary log
  109. 109. Репликация: параллелизм на основе использования write-set ● Write-set транзакции – множество строк измененных транзакцией ● Write-set – средство обнаружить завимости ● Транзакции с непересекающимися write-set можно применять паралелльно ● Параллелизм на основе write-set расширяет механизм на основе логических временных меток ● Зависимости определяются на мастере и выражаются при помощи логических временных меток в binary log
  110. 110. Параллельная репликация до версии 8.0: на основе логических временных меток 1 n n+1 n+2 n+3 n+4 T1T1 Session A Session A T2T2 Session B Session B T3T3 Session B Session B T4T4 Session A Session A T5T5 Session C Session C T6T6 Session C Session C T7T7 Session C Session C T8T8 Session B Session B Время Множествострок
  111. 111. Параллельная репликация начиная с 8.0: на основе использования write-set n n+1 n+2 n+3 n+4 T1T1 Session A Session A T2T2 Session B Session B T3T3 Session B Session B T4T4 Session A Session A T5T5 Session C Session C T6T6 Session C Session C T7T7 Session C Session C T8T8 Session B Session B Время Множествострок 1 Write-set история
  112. 112. Параллельная репликация с использованием write-set с сохранением порядка транзакций в сессии 1 n n+1 n+2 n+3 n+4 T1T1 Session A Session A T2T2 Session B Session B T3T3 Session B Session B T4T4 Session A Session A T5T5 Session C Session C T6T6 Session C Session C T7T7 Session C Session C T8T8 Session B Session B Время Множествострок Write set история
  113. 113. Результаты использования write-set параллелизма: (Sysbench Update Indexed: применение транзакций/сек на реплике) 1 2 4 8 16 32 64 128 256 0 5000 10000 15000 20000 25000 30000 35000 40000 45000 50000 COMMIT_ORDER WRITESET WRITESET_SESSION Количество клиентов на мастере
  114. 114. Спасибо!

×