Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
MySQL 8.0 и Улучшения Percona
Современному Хайлоаду — Современные Решения
10-13 августа 2020
Света Смирнова
• Инженер тех. поддержки MySQL
•
Автор
• MySQL Troubleshooting
•
JSON UDF функции
• FILTER clause для MySQL
• Докладчик
•
...
•Как Работать при Высокой Нагрузке
•Улучшения в MySQL 8.0
Новый Словарь
Оптимизатор Запросов
Другие Улучшения
Содержание
3
1995 Первый релиз MySQL AB
MySQL
4
1995 Первый релиз MySQL AB
2006 Percona Server for MySQL
MySQL
4
1995 Первый релиз MySQL AB
2006 Percona Server for MySQL
2010 Oracle купил MySQL
MySQL
4
1995 Первый релиз MySQL AB
2006 Percona Server for MySQL
2010 Oracle купил MySQL
MySQL для целей этого доклада
MySQL
4
•
Высокая нагрузка
•
Много соединений
•
Много данных
О чём Этот Доклад
5
•
Высокая нагрузка
•
Много соединений
•
Много данных
• Другие улучшения
О чём Этот Доклад
5
Как Работать при Высокой Нагрузке
Connectors: C, JDBC, ODBC, Python, ...
Connection Pool: Authentication, Caches
SQL interface
Parser
Optimizer
Caches and B...
Server
Storage Engine
Поток Соединения и Движка
8
? <= ядер процессора?
Что Происходит с Потоками
9
? <= ядер процессора?
Да Выполняются одновременно
Что Происходит с Потоками
9
? <= ядер процессора?
Да Выполняются одновременно
Нет Ждут в очереди
Что Происходит с Потоками
9
? <= ядер процессора?
Да Выполняются одновременно
Нет Ждут в очереди
? Может диск писать параллельно?
Что Происходит с Пот...
? <= ядер процессора?
Да Выполняются одновременно
Нет Ждут в очереди
? Может диск писать параллельно?
Да Запись происходит...
? <= ядер процессора?
Да Выполняются одновременно
Нет Ждут в очереди
? Может диск писать параллельно?
Да Запись происходит...
• Обычно большинство неактивны
•
Threads_running
Много Соединений?
10
• Обычно большинство неактивны
•
Threads_running
• Много активных?
Percona Thread Pool Plugin
Thread Pool in MariaDB
MySQL...
Основная работа ведётся в коде движка
InnoDB
Много Соединений и Данных
11
•
Транзакционный
•
ACID
•
В стандартной дистрибуции
•
Подходит для большинства сценариев
Почему InnoDB?
12
•
5.7
Geir Hoydalsvik @ OOW 2015
Как Производительность Росла с Версиями
13
• 8.0
Dimitri KRAVTCHUK @ PL 2018
Как Производительность Росла с Версиями
13
5.5 Несколько Buffer Pool
Что Менялось в InnoDB
14
5.6 Несколько purge threads
5.6 Хранимая Optimizer Statistics
5.6 Сохранение InnoDB Buffer Pool
•
Percona Server с версии 5...
5.6 Несколько purge threads
5.6 Хранимая Optimizer Statistics
5.6 Сохранение InnoDB Buffer Pool
5.6 Быстрый checksum алгори...
5.7 Убран mutex contention для read view
5.7 SELECTs: read only по умолчанию
5.7 Не присвается ID read-only транзакциям
5....
5.7 AHI partitioned
5.7 innodb_log_checksum_algorithm
5.7 Page-level компрессия
5.7 General tablespaces
Что Менялось в Inn...
8.0 Системные таблицы в InnoDB
8.0 Descending индексы
8.0 MySQL data dictionary вместо собственного
8.0 Многопоточная иниц...
Улучшения в MySQL 8.0
Улучшения в MySQL 8.0
Новый Словарь
• Transactional
• InnoDB
• Убраны *frm, *TRG и др. файлы
•
Atomic DDL
•
Crash safe DDL
MySQL Data Dictionary
17
ACID
online hot
backup
ibdata1
ib_logfile1
ib_logfile2
db1
————–
t1.ibd
t2.ibd
db2
————–
t1.ibd
t2.ibd
db1
————–
t1.frm
t2...
ACID
online hot
backup
ibdata1
ib_logfile1
ib_logfile2
mysql.ibd
db1
————–
t1.ibd
t2.ibd
db2
————–
t1.ibd
t2.ibd
Другое:
b...
Улучшения в MySQL 8.0
Оптимизатор Запросов
•
Histograms
Optimizer
21
•
Histograms
•
EXPLAIN ANALYZE
Optimizer
21
•
Histograms
•
EXPLAIN ANALYZE
• HASH JOIN
• Для соединений НЕ по индексу!
Optimizer
21
•
Histograms
•
EXPLAIN ANALYZE
• HASH JOIN
• Для соединений НЕ по индексу!
• NOWAIT и SKIP LOCKED
Optimizer
21
1 2 3 4 5 6 7 8 9 10
0
200
400
600
800
Индексы: Данные с Одинаковыми Значениями
22
1 2 3 4 5 6 7 8 9 10
0
200
400
600
800
Индексы: Cardinality
23
1 2 3 4 5 6 7 8 9 10
0
200
400
600
800
Histograms: Данные с Одинаковыми Значениями
24
1 2 3 4 5 6 7 8 9 10
0
0.2
0.4
0.6
0.8
1
Histograms: Данные в Histogram
25
mysql> explain format=tree select * from ol where thread_id=10432 and site_id != 9939
-> order by id limit 3G
************...
mysql> explain format=tree select * from ol where thread_id=10432 and site_id != 9939
-> order by id limit 3G
************...
Nested-Loop Join Algorithm
for each row in t1 matching range {
for each row in t2 matching reference key {
for each row in...
Nested-Loop Join Algorithm
for each row in t1 matching range {
for each row in t2 matching reference key {
for each row in...
Hash join в MySQL 8
•
select first_name, last_name, dept_no
from employees straight_join emp_dept
using(emp_no) where
last...
Hash join в MySQL 8
•
Фаза build
employees
emp_dept
Hash table в памяти
By JOIN condition
hash
Hash Joins
28
Hash join в MySQL 8
•
Фаза probe
employees
emp_dept
Hash table
в памяти
hash
Client
Hash Joins
28
• Обычное сканирование
1
2
3
4
5
Locked
1
2
NOWAIT и SKIP LOCKED
29
• SKIP LOCKED
1
2
3
4
5
Locked
1
2
4
5
NOWAIT и SKIP LOCKED
29
• NOWAIT
1
2
3
4
5
Locked
1
2
Error
NOWAIT и SKIP LOCKED
29
•
Невидимые
Индексы
30
•
Невидимые
mysql> explain format=tree select first_name, last_name, dept_name from employees
-> join dept_emp using(emp_n...
•
Невидимые
mysql> alter table dept_emp alter index dept_no invisible;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Dup...
• По убыванию
Индексы
30
• По убыванию
mysql> alter table salaries add index(from_date, to_date);
mysql> explain select * from salaries order by fr...
• По убыванию
mysql> alter table salaries drop index from_date;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates...
• По убыванию
mysql> explain select * from salaries order by from_date, to_date desc limit 10G
***************************...
• Функциональные
Индексы
30
• Функциональные
mysql> explain select year(hire_date), count(*) as hired from employees
-> group by year(hire_date)G
****...
• Функциональные
mysql> alter table employees add index hire_date_year((year(hire_date)));
mysql> explain select year(hire...
• Index skip scan
• Многоколоночные индексы
key_part_1, key_part_2
• ... WHERE key_part_2 > N
• Запросы к одной таблице
•
...
• Index skip scan
mysql> show create table salariesG
*************************** 1. row ***************************
Table:...
• Index skip scan
mysql> explain select emp_no, from_date, to_date, salary from salaries
-> where to_date > ’1999-01-01’G
...
• Index skip scan
mysql> explain select emp_no, from_date, to_date from salaries
-> where to_date > ’1999-01-01’G
********...
• CTEs
•
Нерекурсивные
mysql> with
-> dept_data as
-> (select emp_no, dept_name from dept_emp join departments using (dept...
• CTEs
• Рекурсивные
mysql> with recursive rand_generator(id, rand_value) as
-> (select 1, rand() union all select id+1, r...
• Window functions
mysql> select
-> row_number() over win as id, dept_no, dept_name from departments
-> window win
-> as (...
• ORDER BY и DISTINCT поддерживают ROLLUP
• Только для запросов с GROUP BY
SQL DML
31
• LATERAL derived tables
mysql> select first_name, last_name, emp_no, s.max_salary, s.from_date from employees e,
-> later...
• Ссылки на внешние таблицы в derived tables
SQL DML
31
Улучшения в MySQL 8.0
Другие Улучшения
• Копирует базу при помощи одной команды
• Быстрое создание реплики
CLONE INSTANCE
33
•
Проверка кастомных правил
•
Валидация JSON schema
CHECK constraint
34
•
Проверка кастомных правил
•
Валидация JSON schema
mysql> create table even (even_value int check(even_value % 2 = 0)) en...
5.7+ Тип данных JSON
•
ВалидацияJSON schema
• Индексы для массивов JSON
• Обновления "на месте"
В том числе на реплике
JSO...
• SET PERSIST
mysql> set persist innodb_file_per_table=1;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from perfor...
• SET PERSIST
•
Новая диагностика
• В Performance Schema
•
Где установлена переменная
mysql> select variable_name, variabl...
• Представления из dictionary tables
• Более производительная
Information Schema
37
•
Индексы
•
Более быстрая
Performance Schema
38
•
Индексы
•
Более быстрая
• Новые инструменты
• Ошибки сервера
• Statement latency histograms
•
Блокировки данных
Performa...
•
Индексы
•
Более быстрая
• Новые инструменты
• Ошибки сервера
• Statement latency histograms
•
Блокировки данных
• Plugga...
• Традиционные объединения
• events_errors_summary_by_account_by_error
•
events_errors_summary_by_host_by_error
• events_e...
• Традиционные объединения
• У всех таблиц одинаковая структура
mysql> DESC events_errors_summary_global_by_error;
+––––––...
•
Несколько адресов для –bind-address
Сеть
40
•
Несколько адресов для –bind-address
•
Admin port
•
В Percona Server с версии 5.5
•
extra_port
Сеть
40
•
Несколько адресов для –bind-address
•
Admin port
•
В Percona Server с версии 5.5
•
extra_port
• Убран mutex bottleneck д...
•
Несколько адресов для –bind-address
•
Admin port
•
В Percona Server с версии 5.5
•
extra_port
• Убран mutex bottleneck д...
•
Более понятные
Сообщения об Ошибках
41
•
Более понятные
•
Severity, error code, subsystem
2020-07-09T11:26:23.927824Z 23 [Note] [MY-010914] [Server]
Aborted conn...
•
Более понятные
•
Severity, error code, subsystem
•
В формате JSON
{
"prio" : 3, "err_code" : 10914, "source_line" : 1046...
•
Более понятные
•
Severity, error code, subsystem
•
В формате JSON
•
Фильтры
Сообщения об Ошибках
41
•
Более понятные
•
Severity, error code, subsystem
•
В формате JSON
•
Фильтры
•
Неспецифические ошибки в error log
Сообщен...
• Фильтры per channel
Репликация
42
• Фильтры per channel
• Write-set dependency tracking
•
Быстрый multi-thread
Репликация
42
• Фильтры per channel
• Write-set dependency tracking
•
Быстрый multi-thread
• Уменьшена contention между receiver и
appli...
• Фильтры per channel
• Write-set dependency tracking
•
Быстрый multi-thread
• Уменьшена contention между receiver и
appli...
•
Не нужно писать повторяющиеся GRANT
mysql> create role read_only, admin;
Query OK, 0 rows affected (0.05 sec)
mysql> gra...
•
Не нужно писать повторяющиеся GRANT
mysql> create user sveta;
Query OK, 0 rows affected (0.01 sec)
mysql> create user ki...
•
Не нужно писать повторяющиеся GRANT
•
Роли по умолчанию
Роли
43
• SUPER разбита на несколько динамических
привилегий
Security
44
• SUPER разбита на несколько динамических
привилегий
•
Secure session variables settings
• MYSQL_SESSION_ADMIN
Старый пост...
• SUPER разбита на несколько динамических
привилегий
•
Secure session variables settings
• MYSQL_SESSION_ADMIN
Старый пост...
• Постоянные таблицы
• Временные таблицы
• Undo tablespaces
•
Системный tablespace
•
Redo log
•
Doublewrite buffer
Percona:...
• MySQL Shell
Ease of Use
46
• MySQL Shell
• Более понятные сообщения об ошибках
Ease of Use
46
• MySQL Shell
• Более понятные сообщения об ошибках
• Поддержка NoSQL
• Schemaless
• JSON Schema
Ease of Use
46
• MySQL Shell
• Более понятные сообщения об ошибках
• Поддержка NoSQL
• Schemaless
• JSON Schema
•
Современный SQL
Ease of...
• Новые версии включают новый функционал
• Продвинутый
• Упрощающий работу
Выводы
47
• Новые версии включают новый функционал
• Продвинутый
• Упрощающий работу
•
Старый код улучшает производительность
Выводы...
• Новые версии включают новый функционал
• Продвинутый
• Упрощающий работу
•
Старый код улучшает производительность
•
Обно...
• Новые версии включают новый функционал
• Продвинутый
• Упрощающий работу
•
Старый код улучшает производительность
•
Обно...
•
Вебинар про Optimizer Histograms
Window functions
MySQL 8.0: Common Table Expressions
MySQL Performance Schema in Action...
• Что нового в репликации в MySQL 8.0?
MySQL 8.0 Roles
Enhanced Encryption в Percona Server
MySQL Shell - the best DBA too...
The complete list of new features in MySQL 8.0
Modern SQL
Dimitri KRAVTCHUK про MySQL 8.0
Чем отличается Percona Server от...
www.slideshare.net/SvetaSmirnova
twitter.com/svetsmirnova
github.com/svetasmirnova
Спасибо!
50
DATABASE PERFORMANCE
MATTERS
Prochain SlideShare
Chargement dans…5
×

Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona

236 vues

Publié le

MySQL всегда использовали под высокой нагрузкой. Недаром эта база была и остаётся самым популярным бэкэндом для web. Однако наши представления о хайлоде с каждым годом расширяются. Большая скорость передачи данных -> больше устройств с подключением к интернет -> больше пользователей -> больше данных.
Задачи, стоящие перед разработчиками MySQL, с каждым годом усложняются.
В этом докладе я расскажу как менялись сценарии использования MySQL за [почти] 25 лет её истории и что делали инженеры, чтобы MySQL оставалась актуальной. Мы затронем такие темы, как работа с большим количеством активных соединений и высокими объёмами данных. Я покажу насколько современные версии лучше справляются с возросшими нагрузками.
Я надеюсь, что после моего доклада те слушатели, которые используют старые версии, захотят обновиться и те, кто уже обновились, узнают как использовать современный MySQL на полную мощность.

Прочитана на конференции OST 2020: https://ostconf.com/materials/2857#2857

Publié dans : Logiciels
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona

  1. 1. MySQL 8.0 и Улучшения Percona Современному Хайлоаду — Современные Решения 10-13 августа 2020 Света Смирнова
  2. 2. • Инженер тех. поддержки MySQL • Автор • MySQL Troubleshooting • JSON UDF функции • FILTER clause для MySQL • Докладчик • Percona Live, OOW, Fosdem, DevConf, HighLoad... Света Смирнова 2
  3. 3. •Как Работать при Высокой Нагрузке •Улучшения в MySQL 8.0 Новый Словарь Оптимизатор Запросов Другие Улучшения Содержание 3
  4. 4. 1995 Первый релиз MySQL AB MySQL 4
  5. 5. 1995 Первый релиз MySQL AB 2006 Percona Server for MySQL MySQL 4
  6. 6. 1995 Первый релиз MySQL AB 2006 Percona Server for MySQL 2010 Oracle купил MySQL MySQL 4
  7. 7. 1995 Первый релиз MySQL AB 2006 Percona Server for MySQL 2010 Oracle купил MySQL MySQL для целей этого доклада MySQL 4
  8. 8. • Высокая нагрузка • Много соединений • Много данных О чём Этот Доклад 5
  9. 9. • Высокая нагрузка • Много соединений • Много данных • Другие улучшения О чём Этот Доклад 5
  10. 10. Как Работать при Высокой Нагрузке
  11. 11. Connectors: C, JDBC, ODBC, Python, ... Connection Pool: Authentication, Caches SQL interface Parser Optimizer Caches and Buffers: Global Engine-specific Storage engines: InnoDB, TokuDB, ... File system: Data, Index, logs, other files • mysqld и его файлы • Коннекторы • Оптимизатор • Кэши • Табличные движки • Управление Архитектура MySQL 7
  12. 12. Server Storage Engine Поток Соединения и Движка 8
  13. 13. ? <= ядер процессора? Что Происходит с Потоками 9
  14. 14. ? <= ядер процессора? Да Выполняются одновременно Что Происходит с Потоками 9
  15. 15. ? <= ядер процессора? Да Выполняются одновременно Нет Ждут в очереди Что Происходит с Потоками 9
  16. 16. ? <= ядер процессора? Да Выполняются одновременно Нет Ждут в очереди ? Может диск писать параллельно? Что Происходит с Потоками 9
  17. 17. ? <= ядер процессора? Да Выполняются одновременно Нет Ждут в очереди ? Может диск писать параллельно? Да Запись происходит Что Происходит с Потоками 9
  18. 18. ? <= ядер процессора? Да Выполняются одновременно Нет Ждут в очереди ? Может диск писать параллельно? Да Запись происходит Нет Ждут в очереди Что Происходит с Потоками 9
  19. 19. • Обычно большинство неактивны • Threads_running Много Соединений? 10
  20. 20. • Обычно большинство неактивны • Threads_running • Много активных? Percona Thread Pool Plugin Thread Pool in MariaDB MySQL Enterprise Thread Pool Много Соединений? 10
  21. 21. Основная работа ведётся в коде движка InnoDB Много Соединений и Данных 11
  22. 22. • Транзакционный • ACID • В стандартной дистрибуции • Подходит для большинства сценариев Почему InnoDB? 12
  23. 23. • 5.7 Geir Hoydalsvik @ OOW 2015 Как Производительность Росла с Версиями 13
  24. 24. • 8.0 Dimitri KRAVTCHUK @ PL 2018 Как Производительность Росла с Версиями 13
  25. 25. 5.5 Несколько Buffer Pool Что Менялось в InnoDB 14
  26. 26. 5.6 Несколько purge threads 5.6 Хранимая Optimizer Statistics 5.6 Сохранение InnoDB Buffer Pool • Percona Server с версии 5.1 Что Менялось в InnoDB 14
  27. 27. 5.6 Несколько purge threads 5.6 Хранимая Optimizer Statistics 5.6 Сохранение InnoDB Buffer Pool 5.6 Быстрый checksum алгоритм CRC32 5.6 Undo log в отдельном tablespace 5.6 Полнотекстовые индексы 5.6 Перемещаемые tablespaces 5.6 Read only транзакции Что Менялось в InnoDB 14
  28. 28. 5.7 Убран mutex contention для read view 5.7 SELECTs: read only по умолчанию 5.7 Не присвается ID read-only транзакциям 5.7 SELECT COUNT(*) читает clustered index 5.7 Нет redo log для временных таблиц 5.7 Temporary tablespace 5.7 Несколько потоков page cleaner 5.7 Native partitioning Что Менялось в InnoDB 14
  29. 29. 5.7 AHI partitioned 5.7 innodb_log_checksum_algorithm 5.7 Page-level компрессия 5.7 General tablespaces Что Менялось в InnoDB 14
  30. 30. 8.0 Системные таблицы в InnoDB 8.0 Descending индексы 8.0 MySQL data dictionary вместо собственного 8.0 Многопоточная инициализация Buffer Pool 8.0 Redo log оптимизация 8.0 CATS Что Менялось в InnoDB 14
  31. 31. Улучшения в MySQL 8.0
  32. 32. Улучшения в MySQL 8.0 Новый Словарь
  33. 33. • Transactional • InnoDB • Убраны *frm, *TRG и др. файлы • Atomic DDL • Crash safe DDL MySQL Data Dictionary 17
  34. 34. ACID online hot backup ibdata1 ib_logfile1 ib_logfile2 db1 ————– t1.ibd t2.ibd db2 ————– t1.ibd t2.ibd db1 ————– t1.frm t2.frm db2 ————– t1.frm t2.frm Другое: binary, error, audit log files База MySQL до 8.0 18
  35. 35. ACID online hot backup ibdata1 ib_logfile1 ib_logfile2 mysql.ibd db1 ————– t1.ibd t2.ibd db2 ————– t1.ibd t2.ibd Другое: binary, error, audit log files База MySQL в 8.0 19
  36. 36. Улучшения в MySQL 8.0 Оптимизатор Запросов
  37. 37. • Histograms Optimizer 21
  38. 38. • Histograms • EXPLAIN ANALYZE Optimizer 21
  39. 39. • Histograms • EXPLAIN ANALYZE • HASH JOIN • Для соединений НЕ по индексу! Optimizer 21
  40. 40. • Histograms • EXPLAIN ANALYZE • HASH JOIN • Для соединений НЕ по индексу! • NOWAIT и SKIP LOCKED Optimizer 21
  41. 41. 1 2 3 4 5 6 7 8 9 10 0 200 400 600 800 Индексы: Данные с Одинаковыми Значениями 22
  42. 42. 1 2 3 4 5 6 7 8 9 10 0 200 400 600 800 Индексы: Cardinality 23
  43. 43. 1 2 3 4 5 6 7 8 9 10 0 200 400 600 800 Histograms: Данные с Одинаковыми Значениями 24
  44. 44. 1 2 3 4 5 6 7 8 9 10 0 0.2 0.4 0.6 0.8 1 Histograms: Данные в Histogram 25
  45. 45. mysql> explain format=tree select * from ol where thread_id=10432 and site_id != 9939 -> order by id limit 3G *************************** 1. row *************************** EXPLAIN: -> Limit: 3 row(s) -> Filter: ((ol.thread_id = 10432) and (ol.site_id <> 9939)) (cost=0.06 rows=3) -> Index scan on ol using PRIMARY (cost=0.06 rows=33) Пример по мотивам MySQL bug #78651 EXPLAIN ANALYZE 26
  46. 46. mysql> explain format=tree select * from ol where thread_id=10432 and site_id != 9939 -> order by id limit 3G *************************** 1. row *************************** EXPLAIN: -> Limit: 3 row(s) -> Filter: ((ol.thread_id = 10432) and (ol.site_id <> 9939)) (cost=0.06 rows=3) -> Index scan on ol using PRIMARY (cost=0.06 rows=33) Пример по мотивам MySQL bug #78651 mysql> explain analyze select * from ol where thread_id=10432 and site_id != 9939 -> order by id limit 3G *************************** 1. row *************************** EXPLAIN: -> Limit: 3 row(s) (actual time=364.792..364.792 rows=0 loops=1) -> Filter: ((ol.thread_id = 10432) and (ol.site_id <> 9939)) (cost=0.06 rows=3) (actual time=364.789..364.789 rows=0 loops=1) -> Index scan on ol using PRIMARY (cost=0.06 rows=33) (actual time=0.417..337.585 rows=100000 loops=1) EXPLAIN ANALYZE 26
  47. 47. Nested-Loop Join Algorithm for each row in t1 matching range { for each row in t2 matching reference key { for each row in t3 { if row satisfies join conditions, send to client } } } Before 8.0: Block Nested Loop 27
  48. 48. Nested-Loop Join Algorithm for each row in t1 matching range { for each row in t2 matching reference key { for each row in t3 { if row satisfies join conditions, send to client } } } • Неэффективный! Циклы! Before 8.0: Block Nested Loop 27
  49. 49. Hash join в MySQL 8 • select first_name, last_name, dept_no from employees straight_join emp_dept using(emp_no) where last_name=’Neiman’ and to_date=’9999-01-01’; Hash Joins 28
  50. 50. Hash join в MySQL 8 • Фаза build employees emp_dept Hash table в памяти By JOIN condition hash Hash Joins 28
  51. 51. Hash join в MySQL 8 • Фаза probe employees emp_dept Hash table в памяти hash Client Hash Joins 28
  52. 52. • Обычное сканирование 1 2 3 4 5 Locked 1 2 NOWAIT и SKIP LOCKED 29
  53. 53. • SKIP LOCKED 1 2 3 4 5 Locked 1 2 4 5 NOWAIT и SKIP LOCKED 29
  54. 54. • NOWAIT 1 2 3 4 5 Locked 1 2 Error NOWAIT и SKIP LOCKED 29
  55. 55. • Невидимые Индексы 30
  56. 56. • Невидимые mysql> explain format=tree select first_name, last_name, dept_name from employees -> join dept_emp using(emp_no) join departments using(dept_no)G *************************** 1. row *************************** EXPLAIN: -> Nested loop inner join (cost=426808.36 rows=354369) -> Nested loop inner join (cost=37002.05 rows=354369) -> Index scan on departments using dept_name (cost=1.90 rows=9) -> Index lookup on dept_emp using dept_no (dept_no=departments.dept_no) (cost=611.18 rows=39374) -> Single-row index lookup on employees using PRIMARY (emp_no=dept_emp.emp_no) (cost=1.00 rows=1) Индексы 30
  57. 57. • Невидимые mysql> alter table dept_emp alter index dept_no invisible; Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> explain format=tree select first_name, last_name, dept_name from employees -> join dept_emp using(emp_no) join departments using(dept_no)G *************************** 1. row *************************** EXPLAIN: -> Nested loop inner join (cost=359050.19 rows=354369) -> Inner hash join (dept_emp.dept_no = departments.dept_no) (cost=284238.88 rows=354369) -> Index scan on dept_emp using PRIMARY (cost=519.88 rows=314995) -> Hash -> Index scan on departments using dept_name (cost=1.90 rows=9) -> Single-row index lookup on employees using PRIMARY (emp_no=dept_emp.emp_no) (cost=0.11 rows=1) Индексы 30
  58. 58. • По убыванию Индексы 30
  59. 59. • По убыванию mysql> alter table salaries add index(from_date, to_date); mysql> explain select * from salaries order by from_date, to_date desc limit 10G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: salaries partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 2632946 filtered: 100.00 Extra: Using filesort Индексы 30
  60. 60. • По убыванию mysql> alter table salaries drop index from_date; Query OK, 0 rows affected (0.08 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table salaries add index(from_date asc, to_date desc); Query OK, 0 rows affected (1 min 5.45 sec) Records: 0 Duplicates: 0 Warnings: 0 Индексы 30
  61. 61. • По убыванию mysql> explain select * from salaries order by from_date, to_date desc limit 10G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: salaries partitions: NULL type: index possible_keys: NULL key: from_date key_len: 6 ref: NULL rows: 10 filtered: 100.00 Extra: NULL 1 row in set, 1 warning (0.00 sec) Индексы 30
  62. 62. • Функциональные Индексы 30
  63. 63. • Функциональные mysql> explain select year(hire_date), count(*) as hired from employees -> group by year(hire_date)G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: employees partitions: NULL type: ALL possible_keys: hire_date key: NULL key_len: NULL ref: NULL rows: 299645 filtered: 100.00 Extra: Using temporary Индексы 30
  64. 64. • Функциональные mysql> alter table employees add index hire_date_year((year(hire_date))); mysql> explain select year(hire_date), count(gender) as hired from employees -> group by year(hire_date)G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: employees partitions: NULL type: index possible_keys: hire_date_year key: hire_date_year key_len: 5 ref: NULL rows: 299468 filtered: 100.00 Extra: NULL Индексы 30
  65. 65. • Index skip scan • Многоколоночные индексы key_part_1, key_part_2 • ... WHERE key_part_2 > N • Запросы к одной таблице • Обращается только к колонкам индекса Индексы 30
  66. 66. • Index skip scan mysql> show create table salariesG *************************** 1. row *************************** Table: salaries Create Table: CREATE TABLE ‘salaries‘ ( ‘emp_no‘ int NOT NULL, ‘salary‘ int NOT NULL, ‘from_date‘ date NOT NULL, ‘to_date‘ date NOT NULL, PRIMARY KEY (‘emp_no‘,‘from_date‘), KEY ‘from_date‘ (‘from_date‘,‘to_date‘), CONSTRAINT ‘salaries_ibfk_1‘ FOREIGN KEY (‘emp_no‘) REFERENCES ‘employees‘ (‘emp_no‘) ON DELETE CASCADE ) /*!50100 TABLESPACE ‘innodb_system‘ */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec) Индексы 30
  67. 67. • Index skip scan mysql> explain select emp_no, from_date, to_date, salary from salaries -> where to_date > ’1999-01-01’G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: salaries partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 2632946 filtered: 33.33 Extra: Using where Индексы 30
  68. 68. • Index skip scan mysql> explain select emp_no, from_date, to_date from salaries -> where to_date > ’1999-01-01’G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: salaries partitions: NULL type: range possible_keys: from_date key: from_date key_len: 6 ref: NULL rows: 877560 filtered: 100.00 Extra: Using where; Using index for skip scan Индексы 30
  69. 69. • CTEs • Нерекурсивные mysql> with -> dept_data as -> (select emp_no, dept_name from dept_emp join departments using (dept_no)) -> select first_name, last_name, dept_name -> from employees join dept_data using(emp_no) -> order by hire_date desc limit 3; +––––––––––––+–––––––––––+––––––––––––––––––––+ | first_name | last_name | dept_name | +––––––––––––+–––––––––––+––––––––––––––––––––+ | Bikash | Covnot | Quality Management | | Yucai | Gerlach | Production | | Hideyuki | Delgrande | Development | +––––––––––––+–––––––––––+––––––––––––––––––––+ 3 rows in set (0.00 sec) SQL DML 31
  70. 70. • CTEs • Рекурсивные mysql> with recursive rand_generator(id, rand_value) as -> (select 1, rand() union all select id+1, rand() from rand_generator where id < 5) -> select * from rand_generator; +––––––+–––––––––––––––––––––+ | id | rand_value | +––––––+–––––––––––––––––––––+ | 1 | 0.5599308382346582 | | 2 | 0.2151867702744778 | | 3 | 0.39614136740205935 | | 4 | 0.33514655692050843 | | 5 | 0.4873087131300091 | +––––––+–––––––––––––––––––––+ 5 rows in set (0.00 sec) SQL DML 31
  71. 71. • Window functions mysql> select -> row_number() over win as id, dept_no, dept_name from departments -> window win -> as (order by dept_no); +––––+–––––––––+––––––––––––––––––––+ | id | dept_no | dept_name | +––––+–––––––––+––––––––––––––––––––+ | 1 | d001 | Marketing | | 2 | d002 | Finance | | 3 | d003 | Human Resources | | 4 | d004 | Production | | 5 | d005 | Development | | 6 | d006 | Quality Management | | 7 | d007 | Sales | | 8 | d008 | Research | | 9 | d009 | Customer Service | +––––+–––––––––+––––––––––––––––––––+ SQL DML 31
  72. 72. • ORDER BY и DISTINCT поддерживают ROLLUP • Только для запросов с GROUP BY SQL DML 31
  73. 73. • LATERAL derived tables mysql> select first_name, last_name, emp_no, s.max_salary, s.from_date from employees e, -> lateral (select salary as max_salary, from_date from salaries -> where emp_no=e.emp_no order by salary desc limit 1) s order by from_date limit 10; +––––––––––––+––––––––––––+––––––––+––––––––––––+––––––––––––+ | first_name | last_name | emp_no | max_salary | from_date | +––––––––––––+––––––––––––+––––––––+––––––––––––+––––––––––––+ | Chuanyi | Tokunaga | 415039 | 46099 | 1985-02-04 | | Mori | Swiss | 35249 | 40000 | 1985-02-04 | | Mariusz | Pokrovskii | 96485 | 56664 | 1985-02-05 | | Aimee | Baja | 229120 | 67400 | 1985-02-06 | | Miyeon | Burnard | 242314 | 45492 | 1985-02-07 | | Duri | Genther | 232968 | 47505 | 1985-02-09 | | Rasikan | Khalil | 474918 | 40000 | 1985-02-10 | | Bernt | Perz | 34059 | 54776 | 1985-02-10 | | Krassimir | Raczkowsky | 467309 | 79945 | 1985-02-12 | | Jixiang | Colorni | 83117 | 65799 | 1985-02-15 | +––––––––––––+––––––––––––+––––––––+––––––––––––+––––––––––––+ SQL DML 31
  74. 74. • Ссылки на внешние таблицы в derived tables SQL DML 31
  75. 75. Улучшения в MySQL 8.0 Другие Улучшения
  76. 76. • Копирует базу при помощи одной команды • Быстрое создание реплики CLONE INSTANCE 33
  77. 77. • Проверка кастомных правил • Валидация JSON schema CHECK constraint 34
  78. 78. • Проверка кастомных правил • Валидация JSON schema mysql> create table even (even_value int check(even_value % 2 = 0)) engine=innodb; Query OK, 0 rows affected (0.05 sec) mysql> insert into even value(2); Query OK, 1 row affected (0.01 sec) mysql> insert into even value(1); ERROR 3819 (HY000): Check constraint ’even_chk_1’ is violated. CHECK constraint 34
  79. 79. 5.7+ Тип данных JSON • ВалидацияJSON schema • Индексы для массивов JSON • Обновления "на месте" В том числе на реплике JSON 35
  80. 80. • SET PERSIST mysql> set persist innodb_file_per_table=1; Query OK, 0 rows affected (0.00 sec) mysql> select * from performance_schema.persisted_variables -> where variable_name=’innodb_file_per_table’G *************************** 1. row *************************** VARIABLE_NAME: innodb_file_per_table VARIABLE_VALUE: ON 1 row in set (0.00 sec) Variables 36
  81. 81. • SET PERSIST • Новая диагностика • В Performance Schema • Где установлена переменная mysql> select variable_name, variable_source -> from performance_schema.variables_info group by variable_source; +––––––––––––––––––––––––––––––––––––––––––––––+–––––––––––––––––+ | variable_name | variable_source | +––––––––––––––––––––––––––––––––––––––––––––––+–––––––––––––––––+ | activate_all_roles_on_login | COMPILED | | binlog_cache_size | COMMAND_LINE | | caching_sha2_password_auto_generate_rsa_keys | EXPLICIT | | foreign_key_checks | DYNAMIC | +––––––––––––––––––––––––––––––––––––––––––––––+–––––––––––––––––+ 4 rows in set (0.01 sec) Variables 36
  82. 82. • Представления из dictionary tables • Более производительная Information Schema 37
  83. 83. • Индексы • Более быстрая Performance Schema 38
  84. 84. • Индексы • Более быстрая • Новые инструменты • Ошибки сервера • Statement latency histograms • Блокировки данных Performance Schema 38
  85. 85. • Индексы • Более быстрая • Новые инструменты • Ошибки сервера • Statement latency histograms • Блокировки данных • Pluggable таблицы Performance Schema 38
  86. 86. • Традиционные объединения • events_errors_summary_by_account_by_error • events_errors_summary_by_host_by_error • events_errors_summary_by_thread_by_error • events_errors_summary_by_user_by_error • events_errors_summary_global_by_error Performance Schema Errors Summary Tables 39
  87. 87. • Традиционные объединения • У всех таблиц одинаковая структура mysql> DESC events_errors_summary_global_by_error; +–––––––––––––––––––+–––––––––––––––––––––+––––––+–––––+–––––––––––––––––––––+ | Field | Type | Null | Key | Default | +–––––––––––––––––––+–––––––––––––––––––––+––––––+–––––+–––––––––––––––––––––+ | ERROR_NUMBER | int(11) | YES | UNI | NULL | | ERROR_NAME | varchar(64) | YES | | NULL | | SQL_STATE | varchar(5) | YES | | NULL | | SUM_ERROR_RAISED | bigint(20) unsigned | NO | | NULL | | SUM_ERROR_HANDLED | bigint(20) unsigned | NO | | NULL | | FIRST_SEEN | timestamp | YES | | 0000-00-00 00:00:00 | | LAST_SEEN | timestamp | YES | | 0000-00-00 00:00:00 | +–––––––––––––––––––+–––––––––––––––––––––+––––––+–––––+–––––––––––––––––––––+ 7 rows in set (0,03 sec) Performance Schema Errors Summary Tables 39
  88. 88. • Несколько адресов для –bind-address Сеть 40
  89. 89. • Несколько адресов для –bind-address • Admin port • В Percona Server с версии 5.5 • extra_port Сеть 40
  90. 90. • Несколько адресов для –bind-address • Admin port • В Percona Server с версии 5.5 • extra_port • Убран mutex bottleneck для connect/disconnect Сеть 40
  91. 91. • Несколько адресов для –bind-address • Admin port • В Percona Server с версии 5.5 • extra_port • Убран mutex bottleneck для connect/disconnect • Хосты длиннее 60 знаков Сеть 40
  92. 92. • Более понятные Сообщения об Ошибках 41
  93. 93. • Более понятные • Severity, error code, subsystem 2020-07-09T11:26:23.927824Z 23 [Note] [MY-010914] [Server] Aborted connection 23 to db: ’sbtest’ user: ’root’ host: ’localhost’ (Got an error reading communication packets). Сообщения об Ошибках 41
  94. 94. • Более понятные • Severity, error code, subsystem • В формате JSON { "prio" : 3, "err_code" : 10914, "source_line" : 1046, "source_file" : "sql_connect.cc", "function" : "end_connection", "msg" : "Aborted connection 32 to db: ’sbtest’ user: ’root’ host: ’localhost’ (Got an error reading communication packets).", "time" : "2020-07-09T11:39:28.905387Z", "thread" : 32, "err_symbol" : "ER_ABORTING_USER_CONNECTION", "SQL_state" : "HY000", "subsystem" : "Server", "label" : "Note" } Сообщения об Ошибках 41
  95. 95. • Более понятные • Severity, error code, subsystem • В формате JSON • Фильтры Сообщения об Ошибках 41
  96. 96. • Более понятные • Severity, error code, subsystem • В формате JSON • Фильтры • Неспецифические ошибки в error log Сообщения об Ошибках 41
  97. 97. • Фильтры per channel Репликация 42
  98. 98. • Фильтры per channel • Write-set dependency tracking • Быстрый multi-thread Репликация 42
  99. 99. • Фильтры per channel • Write-set dependency tracking • Быстрый multi-thread • Уменьшена contention между receiver и applier Репликация 42
  100. 100. • Фильтры per channel • Write-set dependency tracking • Быстрый multi-thread • Уменьшена contention между receiver и applier • Можно изменять GTID_PURGED при непустой GTID_EXECUTED Репликация 42
  101. 101. • Не нужно писать повторяющиеся GRANT mysql> create role read_only, admin; Query OK, 0 rows affected (0.05 sec) mysql> grant select on *.* to ’read_only’; Query OK, 0 rows affected (0.01 sec) mysql> grant super on *.* to ’admin’; Query OK, 0 rows affected, 1 warning (0.01 sec) Роли 43
  102. 102. • Не нужно писать повторяющиеся GRANT mysql> create user sveta; Query OK, 0 rows affected (0.01 sec) mysql> create user kim; Query OK, 0 rows affected (0.01 sec) mysql> create user privileged; Query OK, 0 rows affected (0.01 sec) mysql> grant ’read_only’ to sveta; Query OK, 0 rows affected (0.01 sec) mysql> grant ’read_only’ to kim; Query OK, 0 rows affected (0.01 sec) mysql> grant ’admin’ to privileged; Query OK, 0 rows affected (0.02 sec) Роли 43
  103. 103. • Не нужно писать повторяющиеся GRANT • Роли по умолчанию Роли 43
  104. 104. • SUPER разбита на несколько динамических привилегий Security 44
  105. 105. • SUPER разбита на несколько динамических привилегий • Secure session variables settings • MYSQL_SESSION_ADMIN Старый пост "Ещё раз про бесправных пользователей" не актуален Security 44
  106. 106. • SUPER разбита на несколько динамических привилегий • Secure session variables settings • MYSQL_SESSION_ADMIN Старый пост "Ещё раз про бесправных пользователей" не актуален • Частичный REVOKE Security 44
  107. 107. • Постоянные таблицы • Временные таблицы • Undo tablespaces • Системный tablespace • Redo log • Doublewrite buffer Percona: Enhanced Encryption 45
  108. 108. • MySQL Shell Ease of Use 46
  109. 109. • MySQL Shell • Более понятные сообщения об ошибках Ease of Use 46
  110. 110. • MySQL Shell • Более понятные сообщения об ошибках • Поддержка NoSQL • Schemaless • JSON Schema Ease of Use 46
  111. 111. • MySQL Shell • Более понятные сообщения об ошибках • Поддержка NoSQL • Schemaless • JSON Schema • Современный SQL Ease of Use 46
  112. 112. • Новые версии включают новый функционал • Продвинутый • Упрощающий работу Выводы 47
  113. 113. • Новые версии включают новый функционал • Продвинутый • Упрощающий работу • Старый код улучшает производительность Выводы 47
  114. 114. • Новые версии включают новый функционал • Продвинутый • Упрощающий работу • Старый код улучшает производительность • Обновляйтесь Выводы 47
  115. 115. • Новые версии включают новый функционал • Продвинутый • Упрощающий работу • Старый код улучшает производительность • Обновляйтесь • Даже если не используете новый синтаксис! Выводы 47
  116. 116. • Вебинар про Optimizer Histograms Window functions MySQL 8.0: Common Table Expressions MySQL Performance Schema in Action Как программировать для Performance Schema Подробнее 48
  117. 117. • Что нового в репликации в MySQL 8.0? MySQL 8.0 Roles Enhanced Encryption в Percona Server MySQL Shell - the best DBA tool! Подробнее 48
  118. 118. The complete list of new features in MySQL 8.0 Modern SQL Dimitri KRAVTCHUK про MySQL 8.0 Чем отличается Percona Server от MySQL Дополнительная Информация 49
  119. 119. www.slideshare.net/SvetaSmirnova twitter.com/svetsmirnova github.com/svetasmirnova Спасибо! 50
  120. 120. DATABASE PERFORMANCE MATTERS

×