HighLoad_HomeWork/test/dz002/REPORT.md

44 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### 1. Графики Latency и Kb/s от кол-ва одновременных запросов, до и после установки индексов.
![mountains](img/diagramms.jpg "Диаграммы нагрузки")
### 2. В случае использования индекса indNameSurname:
- #### Запрос на добавление индексов:
```
ALTER TABLE `users` ADD INDEX `indNameSurname` (`Name`, `Surname`);
```
- #### Explain запроса:
```
EXPLAIN SELECT
users.id as id,
users.name as name,
users.surname as surname,
users.birthdate as birthdate,
users.gender as gender,
users.city as city
FROM
users
WHERE users.Name LIKE "ан%" AND users.Surname LIKE "ан%"
ORDER BY id
```
![mountains](img/explain1.jpg "Explain запроса с прямым индексом")
### 3. В случае использования индекса indSurnameName:
- #### Запрос на добавление индексов:
```
ALTER TABLE `users` ADD INDEX `indSurnameName` (`Surname`, `Name`);
```
- #### Explain запроса:
```
EXPLAIN SELECT
users.id as id,
users.name as name,
users.surname as surname,
users.birthdate as birthdate,
users.gender as gender,
users.city as city
FROM
users
WHERE users.Name LIKE "ан%" AND users.Surname LIKE "ан%"
ORDER BY id
```
![mountains](img/explain2.jpg "Explain запроса с обратным индексом")
#### 4. Резюме
Для конечной оптимизации используется составной индекс `('Surname', 'Name')` потому, что в запросе используется объединение AND условий LIKE ?%. Mysql в этом случае ищет по составному индексу и объединяет строки без сортировки. Именно поэтому, приходится принудительно сортировать результаты. Порядок полей выбран с точки зрения селективности. В реальной обстановке поле «Фамилия» все же более селективно чем «Имя». Плюс к этому, мы видим в EXPLAIN запроса, что в случае использования индекса `('Surname', 'Name')` mysql применяет Multi-Range Read оптимизацию, позволяющую линеаризовать процедуру чтения с диска. Возможно за этот счет значительно повысилась скорость передачи данных? по сравнению с индексом `('Name', 'Surname')`.