Цифровое образование

OTUS: Реляционные СУБД // Бесплатный урок OTUS - видео HD

OTUS: Реляционные СУБД // Бесплатный урок OTUS - видео
01:38:39
Работая в сфере IT, нужно постоянно изучать новое, чтобы оптимизировать процессы и улучшать результаты труда. Часто для этого требуется в сжатые сроки освоить смежные направления и новые технологии. Где брать время? Учиться онлайн у профессионалов!

Реляционные СУБД // Бесплатный урок OTUS - видео.

Поговорим о типах индексов (Btree, Bitmap, Hash), обсудим их преимущества и недостатки. В каких случаях какие именно применяются, как они работают при операциях SELECT/INSRT/UPDATE/DELETE, а также когда их применять не стоит.

Преподаватель: Алексей Цыкунов — системный архитектор, Oracle DBA, разработчик perl/python

Подключайтесь к обсуждению в чате — otus.pw/wT8j/

Пройдите опрос по итогам мероприятия — otus.pw/nrrU/

Учитесь у профессионалов: otus.pw/SGz1/

Следите за новостями проекта:

— Facebook: otus.pw/3hO2
— Telegram: t.me/Otusjava
— ВКонтакте: otus.pw/850t
— LinkedIn: otus.pw/yQwQ/
— Хабр: otus.pw/S0nM/
RSS
Алексей Цыкунов
16:53
в лекции была допущена ошибка при рассмотрении поведения сортировки с некорректной интерпретацией using filesort
mysql> explain select * from products order by manufacturer_id;

+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+----------------+
| 1 | SIMPLE | products | NULL | ALL | NULL | NULL | NULL | NULL | 6656 | 100.00 | Using filesort |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set, 1 warning (0.00 sec)

extra = using filesort означает, что Mysql делает дополнительную сортировку в памяти
в нашем случае оптимизатор решил, что ему так выгоднее, чем считывать в память еще и индекс и строить сортировку по нему
наличие в extra еще и using temporary означает что используется врменный тэйблспейс -те используется еще и диск
если же бы мы выбирали одно индексное поле то используется индекс и выдает данные в отсортированном порядке
mysql> explain select manufacturer_id from products;
+----+-------------+----------+------------+-------+---------------+--------------------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+-------+---------------+--------------------+---------+------+------+----------+-------------+
| 1 | SIMPLE | products | NULL | index | NULL | manufacurer_fk_idx | 5 | NULL | 6656 | 100.00 | Using index |
+----+-------------+----------+------------+-------+---------------+--------------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

при наличии условия условия по индексу СУБД по любому читает индекс и использует его для сортировки
mysql> explain select * from products where manufacturer_id<10 order by manufacturer_id;
+----+-------------+----------+------------+-------+--------------------+--------------------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+-------+--------------------+--------------------+---------+------+------+----------+-----------------------+
| 1 | SIMPLE | products | NULL | range | manufacurer_fk_idx | manufacurer_fk_idx | 5 | NULL | 46 | 100.00 | Using index condition |
+----+-------------+----------+------------+-------+--------------------+--------------------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)

Можно также принудительно заставить оптимизатор использовать индекс для сортировки
mysql> explain select * from products FORCE INDEX FOR ORDER BY (manufacurer_fk_idx) order by manufacturer_id;
+----+-------------+----------+------------+-------+---------------+--------------------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+-------+---------------+--------------------+---------+------+------+----------+-------+
| 1 | SIMPLE | products | NULL | index | NULL | manufacurer_fk_idx | 5 | NULL | 6656 | 100.00 | NULL |
+----+-------------+----------+------------+-------+---------------+--------------------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from products USE INDEX FOR ORDER BY (manufacurer_fk_idx) order by manufacturer_id;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+----------------+
| 1 | SIMPLE | products | NULL | ALL | NULL | NULL | NULL | NULL | 6656 | 100.00 | Using filesort |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set, 1 warning (0.00 sec)

обратите внимание на разницу между FORCE и USE

приношу извинение за некорректную интерпретацию во время лекции
Загрузка...