OTUS: Реляционные СУБД // Бесплатный урок OTUS - видео HD
01:38:39
OTUS Онлайн - образование 1575 роликов
2101 просмотр
Реляционные СУБД // Бесплатный урок 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/
Преподаватель: Алексей Цыкунов — системный архитектор, 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/
развернуть свернуть
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
приношу извинение за некорректную интерпретацию во время лекции