homework 6.3: add tasks 3-4

This commit is contained in:
2022-05-30 11:30:48 +07:00
parent d91cf25300
commit 7870726c8c
3 changed files with 119 additions and 2 deletions

View File

@@ -11,6 +11,7 @@ services:
volumes: volumes:
- netology_mysql_data:/var/lib/mysql - netology_mysql_data:/var/lib/mysql
- ./dump:/opt/dump - ./dump:/opt/dump
- ./inno_db.cnf:/etc/mysql/conf.d/inno_db.cnf
volumes: volumes:
netology_mysql_data: netology_mysql_data:

View File

@@ -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

View File

@@ -122,7 +122,93 @@ mysql> select * from INFORMATION_SCHEMA.USER_ATTRIBUTES where USER like 'test';
> - на `MyISAM` > - на `MyISAM`
> - на `InnoDB` > - на `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 ### Задача 4
@@ -137,4 +223,16 @@ mysql> select * from INFORMATION_SCHEMA.USER_ATTRIBUTES where USER like 'test';
> >
> Приведите в ответе измененный файл `my.cnf`. > Приведите в ответе измененный файл `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).