diff --git a/src/homework/06-database/6.3/docker-compose.yml b/src/homework/06-database/6.3/docker-compose.yml index 8d07fd2..2b7e3a3 100644 --- a/src/homework/06-database/6.3/docker-compose.yml +++ b/src/homework/06-database/6.3/docker-compose.yml @@ -11,6 +11,7 @@ services: volumes: - netology_mysql_data:/var/lib/mysql - ./dump:/opt/dump + - ./inno_db.cnf:/etc/mysql/conf.d/inno_db.cnf volumes: netology_mysql_data: \ No newline at end of file diff --git a/src/homework/06-database/6.3/inno_db.cnf b/src/homework/06-database/6.3/inno_db.cnf new file mode 100644 index 0000000..ed5bba4 --- /dev/null +++ b/src/homework/06-database/6.3/inno_db.cnf @@ -0,0 +1,18 @@ +[mysqld] + +# Скорость IO важнее сохранности данных +## Для случаев, когда небольшая потеря данных не критична. +## В этом случае транзакции будут сбрасываться в лог на диск только раз в секунду. +innodb_flush_log_at_trx_commit = 2 + +# Размер буффера с незакомиченными транзакциями 1 Мб +## Но минимальный размер - 4Мб, оставим минималку. +innodb_log_file_size=4MB + +# Буффер кеширования 30% от ОЗУ +## Предположим, что на сервере выделено 16GB RAM. +## В данном случае, 30% от этого значения будет 5GB +innodb_buffer_pool_size=5368709120 + +# Размер файла логов операций 100 Мб +max_binlog_size=104857600 diff --git a/src/homework/06-database/6.3/readme.md b/src/homework/06-database/6.3/readme.md index baa8b58..3bb0b8f 100644 --- a/src/homework/06-database/6.3/readme.md +++ b/src/homework/06-database/6.3/readme.md @@ -122,7 +122,93 @@ mysql> select * from INFORMATION_SCHEMA.USER_ATTRIBUTES where USER like 'test'; > - на `MyISAM` > - на `InnoDB` -// todo +Внутри контейнера в утилите `mysql` выполним следующие запросы: + +```shell +>mysql SET profiling = 1; +Query OK, 0 rows affected, 1 warning (0.00 sec) + +>mysql SHOW PROFILES; ++----------+------------+-------------------+ +| Query_ID | Duration | Query | ++----------+------------+-------------------+ +| 1 | 0.00148925 | SELECT DATABASE() | +| 2 | 0.00042175 | SELECT DATABASE() | +| 3 | 0.01061875 | show databases | +| 4 | 0.00783050 | show tables | ++----------+------------+-------------------+ +4 rows in set, 1 warning (0.00 sec) +``` + +Вывод запроса `SHOW PROFILES` показывает, какие запросы были выполнены недавно на сервере к БД. +По умолчанию, хранится 15 последних запросов. + +Для вывода движка таблицы необходимо использовать следующий запрос: + +```sql +select engine from INFORMATION_SCHEMA.TABLES where table_name like 'orders'; ++--------+ +| ENGINE | ++--------+ +| InnoDB | ++--------+ +``` + +Для чистоты эксперимента, лучше всего будет выполнить запрос на `select` из таблицы, чтобы он попал в список профилировщика. +После этого нужно вывести скорость его выполнения: + +```shell +mysql> select * from orders; +<...> +mysql> SHOW PROFILES; ++----------+------------+-----------------------------------------------------------------------------+ +| Query_ID | Duration | Query | ++----------+------------+-----------------------------------------------------------------------------+ +| <...> | <...> | <...> | +| 7 | 0.00249175 | select * from orders | ++----------+------------+-----------------------------------------------------------------------------+ +``` + +Следующим шагом необходимо изменить `engine` таблицы, выполнить запрос на `select` +и снова вывести список из профилировщика: + +```shell +mysql> alter table orders ENGINE='MYISAM'; +Query OK, 5 rows affected (0.03 sec) +Records: 5 Duplicates: 0 Warnings: 0 + +mysql> select * from orders; +<...> + +mysql> SHOW PROFILES; ++----------+------------+-----------------------------------------------------------------------------+ +| Query_ID | Duration | Query | ++----------+------------+-----------------------------------------------------------------------------+ +| <...> | <...> | <...> | +| 8 | 0.02865275 | alter table orders ENGINE='MYISAM' | +| 9 | 0.00079400 | select * from orders | ++----------+------------+-----------------------------------------------------------------------------+ +``` + +Затем нужно вернуть исходный движок таблицы: + +```shell +alter table orders ENGINE='InnoDB'; +Query OK, 5 rows affected (0.05 sec) +Records: 5 Duplicates: 0 Warnings: 0 + +mysql> SHOW PROFILES; ++----------+------------+-----------------------------------------------------------------------------+ +| Query_ID | Duration | Query | ++----------+------------+-----------------------------------------------------------------------------+ +| <...> | <...> | <...> | +| 10 | 0.05557025 | alter table orders ENGINE='InnoDB' | ++----------+------------+-----------------------------------------------------------------------------+ +``` + +Таким образом, можно сделать два вывода: +1. Перестроение таблицы из `InnoDB` в `MYISAM` происходит быстрее, чем в другую сторону +2. Простейший запрос на `select` выполняется быстрее в таблице с `engine=MYISAM`, чем с `engine=InnoDB` ### Задача 4 @@ -137,4 +223,16 @@ mysql> select * from INFORMATION_SCHEMA.USER_ATTRIBUTES where USER like 'test'; > > Приведите в ответе измененный файл `my.cnf`. -// todo +Файл `my.cnf` самостоятельно не когфигурирует mysql, но читает все конфиг-файлы из директории `/etc/mysql/conf.d`. +Таким образом, чтобы изменить конфигурацию сервера, достаточно создать новый файл, например, `/etc/mysql/conf.d/inno_db.cnf`. + +Для выполнения задач из ТЗ, необходимо применить следующую конфигурацию: + +- Скорость IO важнее сохранности данных: `innodb_flush_log_at_trx_commit = 2` +- Нужна компрессия таблиц для экономии места на диске: в данном случае это невозможно сконфигурировать, + необходимо специально создавать или изменять таблицы, применяя `ROW_FORMAT=COMPRESSED`. +- Размер буффера с незакомиченными транзакциями 1 Мб: невозможно применить, так как минимальный размер конфига `innodb_log_file_size` - 4Мб. +- Буффер кеширования 30% от ОЗУ: `innodb_buffer_pool_size=5368709120`. +- Размер файла логов операций 100 Мб: `max_binlog_size=104857600`. + +Конфигурация расположена в файле [inno_db.cnf](./inno_db.cnf). \ No newline at end of file