РИТ++ 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);
- ролях и других изменениях в системе привилегий;
- улучшениях в репликации.
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. Актуальные версии 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. Актуальные версии 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. Актуальные версии 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. Актуальные версии 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. MySQL 8.0 с высоты птичьего полета
● Новый словарь данных и поддержка атомарного DDL
● Табличные выражения (CTE), оконные функции
● Убывающие и невидимые индексы
● Улучшения в поддержке Unicode
● Гибкая работа с блокировками (SKIP LOCKED/NO WAIT)
● Роли, улучшения в системе привилегий
● Улучшения в репликации
8. Словарь данных до 8.0:
Метаданные хранятся в разных местах
Словарь данных
Файлы
FRM TRG OPT
Таблицы (mysql.*)
user procevents
Таблицы (innodb.sys)
MyISAM
File
system
InnoDB
S
Q
L
9. Словарь данных до 8.0:
Проблемы
● INFORMATION_SCHEMA медленная
● Конфликты из-за нетранзакционного хранения МД
● Конфликты между МД в InnoDB и в ядре сервера
● Трудно реализовать атомарный и транзакционный DDL
● Проблемы с репликацией неатомарного DDL
● Сложно расширять
10. Словарь данных до 8.0:
Проблемы
● INFORMATION_SCHEMA медленная
● Конфликты из-за нетранзакционного хранения МД
● Конфликты между МД в InnoDB и в ядре сервера
● Трудно реализовать атомарный и транзакционный DDL
● Проблемы с репликацией неатомарного DDL
● Сложно расширять
11. Словарь данных до 8.0:
Проблемы
● INFORMATION_SCHEMA медленная
● Конфликты из-за нетранзакционного хранения МД
● Конфликты между МД в InnoDB и в ядре сервера
● Трудно реализовать атомарный и транзакционный DDL
● Проблемы с репликацией неатомарного DDL
● Сложно расширять
12. Словарь данных до 8.0:
Проблемы
● INFORMATION_SCHEMA медленная
● Конфликты из-за нетранзакционного хранения МД
● Конфликты между МД в InnoDB и в ядре сервера
● Трудно реализовать атомарный и транзакционный DDL
● Проблемы с репликацией неатомарного DDL
● Сложно расширять
13. Словарь данных до 8.0:
Проблемы
● INFORMATION_SCHEMA медленная
● Конфликты из-за нетранзакционного хранения МД
● Конфликты между МД в InnoDB и в ядре сервера
● Трудно реализовать атомарный и транзакционный DDL
● Проблемы с репликацией неатомарного DDL
● Сложно расширять
14. Словарь данных до 8.0:
Проблемы
● INFORMATION_SCHEMA медленная
● Конфликты из-за нетранзакционного хранения МД
● Конфликты между МД в InnoDB и в ядре сервера
● Трудно реализовать атомарный и транзакционный DDL
● Проблемы с репликацией неатомарного DDL
● Сложно расширять
15. Словарь данных до 8.0:
Проблемы
● INFORMATION_SCHEMA медленная
● Конфликты из-за нетранзакционного хранения МД
● Конфликты между МД в InnoDB и в ядре сервера
● Трудно реализовать атомарный и транзакционный DDL
● Проблемы с репликацией неатомарного DDL
● Сложно расширять
16. Новый словарь данных
● Единое хранилище для всех метаданных – таблицы
– Транзакционность
– INFORMATION_SCHEMA – просто представления
● Единое API для ядра сервера, SE и плагинов
● Единообразное API для разных объектов
● Расширяемость
– Продуман upgrade
– Поддержка плагинов
● Поддержка disaster recovery (SDI)
17. Новый словарь данных
● Единое хранилище для всех метаданных – таблицы
– Транзакционность
– INFORMATION_SCHEMA – просто представления
● Единое API для ядра сервера, SE и плагинов
● Единообразное API для разных объектов
● Расширяемость
– Продуман upgrade
– Поддержка плагинов
● Поддержка disaster recovery (SDI)
18. Новый словарь данных
● Единое хранилище для всех метаданных – таблицы
– Транзакционность
– INFORMATION_SCHEMA – просто представления
● Единое API для ядра сервера, SE и плагинов
● Единообразное API для разных объектов
● Расширяемость
– Продуман upgrade
– Поддержка плагинов
● Поддержка disaster recovery (SDI)
19. Новый словарь данных
● Единое хранилище для всех метаданных – таблицы
– Транзакционность
– INFORMATION_SCHEMA – просто представления
● Единое API для ядра сервера, SE и плагинов
● Единообразное API для разных объектов
● Расширяемость
– Продуман upgrade
– Поддержка плагинов
● Поддержка disaster recovery (SDI)
20. Новый словарь данных
● Единое хранилище для всех метаданных – таблицы
– Транзакционность
– INFORMATION_SCHEMA – просто представления
● Единое API для ядра сервера, SE и плагинов
● Единообразное API для разных объектов
● Расширяемость
– Продуман upgrade
– Поддержка плагинов
● Поддержка disaster recovery (SDI)
21. Новый словарь данных
● Единое хранилище для всех метаданных – таблицы
– Транзакционность
– INFORMATION_SCHEMA – просто представления
● Единое API для ядра сервера, SE и плагинов
● Единообразное API для разных объектов
● Расширяемость
– Продуман upgrade
– Поддержка плагинов
● Поддержка disaster recovery (SDI)
24. INFORMATION_SCHEMA в 5.7
Клиент
Запрос к I_S Результаты
Сервер MySQL
Создание временной
таблицы
.
Временная
таблица
ФС / MyISAM
/ InnoDB SE
Оптимизатор готовит
план запроса.
25. INFORMATION_SCHEMA в 5.7
Клиент
Запрос к I_S Результаты
Сервер MySQL
Создание временной
таблицы
.
Временная
таблица
ФС / MyISAM
/ InnoDB SE
Оптимизатор готовит
план запроса.
План выполняется, заполняются временные таблицы,
читаются строки из временных таблиц.
26. INFORMATION_SCHEMA в 5.7
Клиент
Запрос к I_S Результаты
Сервер MySQL
Создание временной
таблицы
Эвристики
Чтение метаданных с ФС или MyISAM/
InnoDB.
.
Временная
таблица
ФС / MyISAM
/ InnoDB SE
Оптимизатор готовит
план запроса.
План выполняется, заполняются временные таблицы,
читаются строки из временных таблиц.
27. INFORMATION_SCHEMA в 5.7
Клиент
Запрос к I_S Результаты
Сервер MySQL
Создание временной
таблицы
Эвристики
Чтение метаданных с ФС или MyISAM/
InnoDB.
.
Временная
таблица
ФС / MyISAM
/ InnoDB SE
Оптимизатор готовит
план запроса.
План выполняется, заполняются временные таблицы,
читаются строки из временных таблиц.
28. INFORMATION_SCHEMA в 5.7
Клиент
Запрос к I_S Результаты
Сервер MySQL
Создание временной
таблицы
Эвристики
Чтение метаданных с ФС или MyISAM/
InnoDB.
.
Временная
таблица
Возвращаем строки
пользователю.
ФС / MyISAM
/ InnoDB SE
Оптимизатор готовит
план запроса.
План выполняется, заполняются временные таблицы,
читаются строки из временных таблиц.
29. INFORMATION_SCHEMA в 5.7
Клиент
Запрос к I_S Результаты
Сервер MySQL
Создание временной
таблицы
Эвристики
Чтение метаданных с ФС или MyISAM/
InnoDB.
.
Временная
таблица
Возвращаем строки
пользователю.
ФС / MyISAM
/ InnoDB SE
Оптимизатор готовит
план запроса.
План выполняется, заполняются временные таблицы,
читаются строки из временных таблиц.
32. INFORMATION_SCHEMA в 8.0
Клиент
Запрос к I_S Результаты
Сервер MySQL
.
InnoDB SE
Оптимизатор готовит
план запроса.
План выполняется,
читаются строки из таблиц СД.
33. INFORMATION_SCHEMA в 8.0
Клиент
Запрос к I_S Результаты
Сервер MySQL
.
Возвращаем строки
пользователю.
InnoDB SE
Оптимизатор готовит
план запроса.
План выполняется,
читаются строки из таблиц СД.
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. Атомарный DDL
● Семантика все или ничего при ошибках
– Лучше соотвествует ожиданиям пользователей
– Проще реплицировать
● Согласованность информации при падении сервера
– Словарь данных
– SE
– Binary log
● Нужна поддержка в SE (InnoDB, NDB)
В разработке
36. Атомарный DDL
● Семантика все или ничего при ошибках
– Лучше соотвествует ожиданиям пользователей
– Проще реплицировать
● Согласованность информации при падении сервера
– Словарь данных
– SE
– Binary log
● Нужна поддержка в SE (InnoDB, NDB)
В разработке
37. Атомарный DDL
● Семантика все или ничего при ошибках
– Лучше соотвествует ожиданиям пользователей
– Проще реплицировать
● Согласованность информации при падении сервера
– Словарь данных
– SE
– Binary log
● Нужна поддержка в SE (InnoDB, NDB)
В разработке
38. Атомарный DDL
● Семантика все или ничего при ошибках
– Лучше соотвествует ожиданиям пользователей
– Проще реплицировать
● Согласованность информации при падении сервера
– Словарь данных
– SE
– Binary log
● Нужна поддержка в SE (InnoDB, NDB)
В разработке
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. Работа с иерархическими данными до 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. Работа с иерархическими данными до 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. Работа с иерархическими данными до 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. Работа с иерархическими данными в 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. Работа с иерархическими данными в 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. Работа с иерархическими данными в 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. Работа с иерархическими данными в 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. Работа с иерархическими данными в 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. Табличные выражения: не только рекурсия!
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. Табличные выражения: не только рекурсия!
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. Табличные выражения: не только рекурсия!
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. Табличные выражения: не только рекурсия!
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. Оконные функции
Проблема:
● До версии 8.0 сложно и иногда невозможно считать
агрегатные функции от группы из текущей и связанных
с нею строк (окна) без группировки всех строк в
группе.
Решение:
● Оконные функции
53. Оконные функции
Проблема:
● До версии 8.0 сложно и иногда невозможно считать
агрегатные функции от группы из текущей и связанных
с нею строк (окна) без группировки всех строк в
группе.
Решение:
● Оконные функции
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. Оконные функции: пример
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. Оконные функции: пример
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. Убывающие индексы до 8.0
● Поддержка синтаксиса
● Создается обычный возрастающий индекс
● Проблемы:
– Сканирование в обратном порядке дороже
– Нельзя использовать индекс когда нужно разное
направление обхода по разным колонкам индекса
58. Убывающие индексы до 8.0
● Поддержка синтаксиса
● Создается обычный возрастающий индекс
● Проблемы:
– Сканирование в обратном порядке дороже
– Нельзя использовать индекс когда нужно разное
направление обхода по разным колонкам индекса
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. Убывающие индексы в 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. Невидимые индексы
Что это такое ?
● Невидимы для оптимизатора
● Но обновляются DML (сравните с DISABLED индексами)
Нужно для:
● “Удаление” индексов с мгновенным восстановлением
● Пошаговое добавление индексов
62. Невидимые индексы
Что это такое ?
● Невидимы для оптимизатора
● Но обновляются DML (сравните с DISABLED индексами)
Нужно для:
● “Удаление” индексов с мгновенным восстановлением
● Пошаговое добавление индексов
63. Невидимые индексы: пример
● Думаем что индекс не используется:
ALTER TABLE country ALTER INDEX c INVISIBLE;
● Ошиблись! Быстро возвращаем индекс назад:
ALTER TABLE country ALTER INDEX c VISIBLE;
● Все верно. Можно удалить индекс:
ALTER TABLE country DROP INDEX c;
64. Невидимые индексы: пример
● Думаем что индекс не используется:
ALTER TABLE country ALTER INDEX c INVISIBLE;
● Ошиблись! Быстро возвращаем индекс назад:
ALTER TABLE country ALTER INDEX c VISIBLE;
● Все верно. Можно удалить индекс:
ALTER TABLE country DROP INDEX c;
65. Невидимые индексы: пример
● Думаем что индекс не используется:
ALTER TABLE country ALTER INDEX c INVISIBLE;
● Ошиблись! Быстро возвращаем индекс назад:
ALTER TABLE country ALTER INDEX c VISIBLE;
● Все верно. Можно удалить индекс:
ALTER TABLE country DROP INDEX c;
66. Unicode
● Utf8mb4 – по умолчанию в 8.0!
● Поддержка Unicode 9.0
● Новые accent-sensitive и case-sensitive collation
● Collation специфичные для различных языков
– В том числе для японского!
● Оптимизация производительности utf8mb4
– Самой реализации
– Сортировки ключей переменной длины
67. Unicode
● Utf8mb4 – по умолчанию в 8.0!
● Поддержка Unicode 9.0
● Новые accent-sensitive и case-sensitive collation
● Collation специфичные для различных языков
– В том числе для японского!
● Оптимизация производительности utf8mb4
– Самой реализации
– Сортировки ключей переменной длины
68. Unicode
● Utf8mb4 – по умолчанию в 8.0!
● Поддержка Unicode 9.0
● Новые accent-sensitive и case-sensitive collation
● Collation специфичные для различных языков
– В том числе для японского!
● Оптимизация производительности utf8mb4
– Самой реализации
– Сортировки ключей переменной длины
69. Unicode
● Utf8mb4 – по умолчанию в 8.0!
● Поддержка Unicode 9.0
● Новые accent-sensitive и case-sensitive collation
● Collation специфичные для различных языков
– В том числе для японского!
● Оптимизация производительности utf8mb4
– Самой реализации
– Сортировки ключей переменной длины
70. Unicode
● Utf8mb4 – по умолчанию в 8.0!
● Поддержка Unicode 9.0
● Новые accent-sensitive и case-sensitive collation
● Collation специфичные для различных языков
– В том числе для японского!
● Оптимизация производительности utf8mb4
– Самой реализации
– Сортировки ключей переменной длины
71. Unicode
● Utf8mb4 – по умолчанию в 8.0!
● Поддержка Unicode 9.0
● Новые accent-sensitive и case-sensitive collation
● Collation специфичные для различных языков
– В том числе для японского!
● Оптимизация производительности utf8mb4
– Самой реализации
– Сортировки ключей переменной длины
75. Гибкая работа с блокировками
Проблема:
Хочется пропускать заблокированные строки:
– Выборка из таблицы заданий
– Резервирование ресурса
Решение:
SELECT … FOR UPDATE SKIP LOCKED;
76. Гибкая работа с блокировками
Проблема:
Хочется пропускать заблокированные строки:
– Выборка из таблицы заданий
– Резервирование ресурса
Решение:
SELECT … FOR UPDATE SKIP LOCKED;
77. Гибкая работа с блокировками
Проблема:
Хочется пропускать заблокированные строки:
– Выборка из таблицы заданий
– Резервирование ресурса
Решение:
SELECT … FOR UPDATE SKIP LOCKED;
78. Гибкая работа с блокировками (детали)
● SKIP LOCKED – пропустить заблокированные строки
● Используется совместно с:
– FOR UPDATE
– FOR SHARE (замена LOCK IN SHARE MODE)
● FOR UPDATE OF <table_name> SKIP LOCKED
● NOWAIT – выдать ошибку вместо ожидания
79. Гибкая работа с блокировками (детали)
● SKIP LOCKED – пропустить заблокированные строки
● Используется совместно с:
– FOR UPDATE
– FOR SHARE (замена LOCK IN SHARE MODE)
● FOR UPDATE OF <table_name> SKIP LOCKED
● NOWAIT – выдать ошибку вместо ожидания
80. Гибкая работа с блокировками (детали)
● SKIP LOCKED – пропустить заблокированные строки
● Используется совместно с:
– FOR UPDATE
– FOR SHARE (замена LOCK IN SHARE MODE)
● FOR UPDATE OF <table_name> SKIP LOCKED
● NOWAIT – выдать ошибку вместо ожидания
81. Гибкая работа с блокировками (детали)
● SKIP LOCKED – пропустить заблокированные строки
● Используется совместно с:
– FOR UPDATE
– FOR SHARE (замена LOCK IN SHARE MODE)
● FOR UPDATE OF <table_name> SKIP LOCKED
● NOWAIT – выдать ошибку вместо ожидания
82. Роли
● Именованные коллекции привилегий
– Могут включать другие роли
● Упрощают управление привилегиями пользователей
– Проще структура привилегий
– Легко добавлять и отбирать привилегии
● Можно активировать/деактивировать для сессии
● Можно назначить несколько активных ролей по умолчанию
● ROLES_GRAPHML()
83. Роли
● Именованные коллекции привилегий
– Могут включать другие роли
● Упрощают управление привилегиями пользователей
– Проще структура привилегий
– Легко добавлять и отбирать привилегии
● Можно активировать/деактивировать для сессии
● Можно назначить несколько активных ролей по умолчанию
● ROLES_GRAPHML()
84. Роли
● Именованные коллекции привилегий
– Могут включать другие роли
● Упрощают управление привилегиями пользователей
– Проще структура привилегий
– Легко добавлять и отбирать привилегии
● Можно активировать/деактивировать для сессии
● Можно назначить несколько активных ролей по умолчанию
● ROLES_GRAPHML()
85. Роли
● Именованные коллекции привилегий
– Могут включать другие роли
● Упрощают управление привилегиями пользователей
– Проще структура привилегий
– Легко добавлять и отбирать привилегии
● Можно активировать/деактивировать для сессии
● Можно назначить несколько активных ролей по умолчанию
● ROLES_GRAPHML()
86. Роли
● Именованные коллекции привилегий
– Могут включать другие роли
● Упрощают управление привилегиями пользователей
– Проще структура привилегий
– Легко добавлять и отбирать привилегии
● Можно активировать/деактивировать для сессии
● Можно назначить несколько активных ролей по умолчанию
● ROLES_GRAPHML()
87. Роли
● Именованные коллекции привилегий
– Могут включать другие роли
● Упрощают управление привилегиями пользователей
– Проще структура привилегий
– Легко добавлять и отбирать привилегии
● Можно активировать/деактивировать для сессии
● Можно назначить несколько активных ролей по умолчанию
● ROLES_GRAPHML()
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. Роли: пример
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. Роли: пример
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. Роли: пример
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. Роли: пример
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. Динамические привилегии
Проблема: SUPER привилегия перегружена
Решение: Динамические привилегии
● Глобального уровня
● Замена SUPER:
AUDIT_ADMIN, BINLOG_ADMIN, CONNECTION_ADMIN,
ENCRYPTION_KEY_ADMIN, FIREWALL_ADMIN,...
● Изначально привилегии добавляемые плагинами
94. Динамические привилегии
Проблема: SUPER привилегия перегружена
Решение: Динамические привилегии
● Глобального уровня
● Замена SUPER:
AUDIT_ADMIN, BINLOG_ADMIN, CONNECTION_ADMIN,
ENCRYPTION_KEY_ADMIN, FIREWALL_ADMIN,...
● Изначально привилегии добавляемые плагинами
95. Динамические привилегии
Проблема: SUPER привилегия перегружена
Решение: Динамические привилегии
● Глобального уровня
● Замена SUPER:
AUDIT_ADMIN, BINLOG_ADMIN, CONNECTION_ADMIN,
ENCRYPTION_KEY_ADMIN, FIREWALL_ADMIN,...
● Изначально привилегии добавляемые плагинами
96. Динамические привилегии
Проблема: SUPER привилегия перегружена
Решение: Динамические привилегии
● Глобального уровня
● Замена SUPER:
AUDIT_ADMIN, BINLOG_ADMIN, CONNECTION_ADMIN,
ENCRYPTION_KEY_ADMIN, FIREWALL_ADMIN,...
● Изначально привилегии добавляемые плагинами
97. Репликация: оптимизация взаимодействия
между I/O и SQL потоками
Проблема:
Репликация отстает или неэффективна
Решение:
Вынести запись и чтение в/из relay log из критических секций
Меньше держим блокировки
Потоки ждут доступа к relay log меньше
Выше производительность
98. Репликация: оптимизация взаимодействия
между I/O и SQL потоками
Проблема:
Репликация отстает или неэффективна
Решение:
Вынести запись и чтение в/из relay log из критических секций
Меньше держим блокировки
Потоки ждут доступа к relay log меньше
Выше производительность
99. Репликация: оптимизация взаимодействия
между I/O и SQL потоками
Проблема:
Репликация отстает или неэффективна
Решение:
Вынести запись и чтение в/из relay log из критических секций
Меньше держим блокировки
Потоки ждут доступа к relay log меньше
Выше производительность
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. Результаты оптимизации взаимодействия между 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. Репликация: параллелизм
на основе использования write-set
Проблема:
● Репликация отстает или неэффективна
● Параллельная репликация на основе логических временных меток не
помогает
– Малое число или одно соединение на мастере
– Сложная топология приводит к потере параллелизма
Решение:
● Использовать параллелизм на основе write-set транзакций
103. Репликация: параллелизм
на основе использования write-set
Проблема:
● Репликация отстает или неэффективна
● Параллельная репликация на основе логических временных меток не
помогает
– Малое число или одно соединение на мастере
– Сложная топология приводит к потере параллелизма
Решение:
● Использовать параллелизм на основе write-set транзакций
104. Репликация: параллелизм
на основе использования write-set
Проблема:
● Репликация отстает или неэффективна
● Параллельная репликация на основе логических временных меток не
помогает
– Малое число или одно соединение на мастере
– Сложная топология приводит к потере параллелизма
Решение:
● Использовать параллелизм на основе write-set транзакций
105. Репликация: параллелизм
на основе использования write-set
● Write-set транзакции – множество строк измененных
транзакцией
● Write-set – средство обнаружить завимости
● Транзакции с непересекающимися write-set можно применять
паралелльно
● Параллелизм на основе write-set расширяет механизм на
основе логических временных меток
● Зависимости определяются на мастере и выражаются при
помощи логических временных меток в binary log
106. Репликация: параллелизм
на основе использования write-set
● Write-set транзакции – множество строк измененных
транзакцией
● Write-set – средство обнаружить завимости
● Транзакции с непересекающимися write-set можно применять
паралелльно
● Параллелизм на основе write-set расширяет механизм на
основе логических временных меток
● Зависимости определяются на мастере и выражаются при
помощи логических временных меток в binary log
107. Репликация: параллелизм
на основе использования write-set
● Write-set транзакции – множество строк измененных
транзакцией
● Write-set – средство обнаружить завимости
● Транзакции с непересекающимися write-set можно применять
паралелльно
● Параллелизм на основе write-set расширяет механизм на
основе логических временных меток
● Зависимости определяются на мастере и выражаются при
помощи логических временных меток в binary log
108. Репликация: параллелизм
на основе использования write-set
● Write-set транзакции – множество строк измененных
транзакцией
● Write-set – средство обнаружить завимости
● Транзакции с непересекающимися write-set можно применять
паралелльно
● Параллелизм на основе write-set расширяет механизм на
основе логических временных меток
● Зависимости определяются на мастере и выражаются при
помощи логических временных меток в binary log
109. Репликация: параллелизм
на основе использования write-set
● Write-set транзакции – множество строк измененных
транзакцией
● Write-set – средство обнаружить завимости
● Транзакции с непересекающимися write-set можно применять
паралелльно
● Параллелизм на основе write-set расширяет механизм на
основе логических временных меток
● Зависимости определяются на мастере и выражаются при
помощи логических временных меток в binary log
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. Параллельная репликация начиная с 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. Параллельная репликация с использованием 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. Результаты использования 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
Количество клиентов на мастере