Successfully reported this slideshow.
Your SlideShare is downloading. ×

Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лукьянчиков (ООО «Станигост»)

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 40 Ad

Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лукьянчиков (ООО «Станигост»)

Download to read offline

Индексы
- типы индексов;
- типы доступа к таблице;
- составные индексы (когда они работают);
- получение информации об индексе (show index; - описание формата);
- примеры с поиском по нескольким полям и сортировкой: какие индексы будут использоваться, а какие нет;
- что делать в случае нескольких условий по диапазону;
- как сервер выбирает индекс, который будет использован;
- директивы use/force/ignore index.

EXPLAIN
- как работает оптимизатор запросов;
- недостатки explain;
- explain extended;
- получение sql запроса, восстановленного из плана;
- формат выводимой explain информации:
-- что означает каждый столбец;
-- какие значения принимает (для extra только самые часто встречающиеся);
-- на что обратить внимание с точки зрения производительности;
-- как правильно читать план-разбор сложного примера с join-ами, подзапросами (обычными и from) и union-ами;
- новые возможности explain в последних версиях.

Практические примеры (исходный запрос, план, оптимизация, итоговый план) для разных случаев оптимизации:
1. добавление индексов;
2. эквивалентное изменение запроса: or --> union, подзапрос --> join;
3. разбиение запроса на несколько с сохранением промежуточных данных во временной таблице;
4. изменение структуры данных;
5. использование пользовательских переменных.

Индексы
- типы индексов;
- типы доступа к таблице;
- составные индексы (когда они работают);
- получение информации об индексе (show index; - описание формата);
- примеры с поиском по нескольким полям и сортировкой: какие индексы будут использоваться, а какие нет;
- что делать в случае нескольких условий по диапазону;
- как сервер выбирает индекс, который будет использован;
- директивы use/force/ignore index.

EXPLAIN
- как работает оптимизатор запросов;
- недостатки explain;
- explain extended;
- получение sql запроса, восстановленного из плана;
- формат выводимой explain информации:
-- что означает каждый столбец;
-- какие значения принимает (для extra только самые часто встречающиеся);
-- на что обратить внимание с точки зрения производительности;
-- как правильно читать план-разбор сложного примера с join-ами, подзапросами (обычными и from) и union-ами;
- новые возможности explain в последних версиях.

Практические примеры (исходный запрос, план, оптимизация, итоговый план) для разных случаев оптимизации:
1. добавление индексов;
2. эквивалентное изменение запроса: or --> union, подзапрос --> join;
3. разбиение запроса на несколько с сохранением промежуточных данных во временной таблице;
4. изменение структуры данных;
5. использование пользовательских переменных.

Advertisement
Advertisement

More Related Content

Slideshows for you (20)

Viewers also liked (12)

Advertisement

More from Ontico (20)

Recently uploaded (19)

Advertisement

Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лукьянчиков (ООО «Станигост»)

  1. 1. Основы индексирования и расширенные возможности EXPLAIN MySQLв Василий Лукьянчико в
  2. 2. План • Архитектура • Основы индексирования • EXPLAIN (примеры)
  3. 3. Архитектура MySQL
  4. 4. Индексы CREATE TABLE test ( id int not null auto_increment PRIMARY KEY, … INDEX(id), UNIQUE(id)); index(A) ненужен при index(A,B) (если обаb-tree) whereB=5 <=> whereA in (0,1) and B=5 (select .. whereA=0 and B=5 order by C limit 10) union all (select .. whereA=1 and B=5 order by C limit 10) order by C limit 10;
  5. 5. Составные индексы index(A,B,C) только последовательно и без пропусков WHEREA=10AND B>405; WHERE B=10AND A=9AND C<504; WHEREA=10AND B=7 ORDER BY C; WHERE B=3; WHEREA=10AND B>4AND C>17; WHEREA=10 ORDER BY C; WHEREA=10 ORDER BY B, C; WHEREA=10 ORDER BY B, C DESC;
  6. 6. Индексы не работают • часть выражения: id + 1 = 3 year(key)=2015 <=> key between ‘2015-01-01’ and ‘2015-12-31’ • преобразованиетипов: key_str = 15 • несоответствиекодировок: key.utf = key.latin • неиспользуется левая часть составного индекса: index(a,b); whereb = x • поиск по суффиксу: key like‘%x’ • сравнениес исходной таблицей: t.key = t.col
  7. 7. index condition pushdown WHEREA=10AND B like‘%x’; WHEREA=10AND C=7;
  8. 8. Extended keys вторичныеinnodb индексы имеют «хвост» из первичного primary (A, B) index(C) => (C, A, B) index(B, C) => (B, C, A), не(B, C, A, B) только для фильтрации строк MariaDB 5.5 / MySQL 5.6
  9. 9. Ограничения оптимизатора • мало статистики • неучитывает особенности хранилищ, нагрузку, буферы соединений и кэши • метрика • сложность выбора • использует правила whereabetween 1 and 4 wherea>0 and a< 5
  10. 10. Оптимизатор • Проверканатривиальность • Преобразованиезапроса • Реестр индексов • Выбирает самый дешевый план Учитывает: • SHOW CREATE TABLE и SHOW TABLE STATUS • SHOW INDEX • статистическая информация об индексах • независимая статистика
  11. 11. Влияние на оптимизатор • переписать запрос • индексы • use/force/ignoreindex • straight_join • @@optimizer_switch • optimizer_prune_level и optimizer_search_depth
  12. 12. SQL_CALC_FOUND_ROWS SELECT SQL_CALC_FOUND_ROWS... LIMIT ... SELECT ... LIMIT ... SELECT COUNT(*) ... 2 задачи – 1 метод непозволяет использовать ряд оптимизаций
  13. 13. Недостатки explain • неучитывает хранимыефункции • может обмануть • мало информации: план совпадает – производительность нет; одинаковыетермины для различных ситуаций • выполнениеfrom подзапросов • может выполняться дольше, чем сам запрос • оптимален ли план? • соответствует ли тому, что было насамом деле?
  14. 14. Виды explain EXPLAIN PARTITIONS.. EXPLAIN EXTENDED .. SHOW WARNINGS; sql запрос восстановленный из планавыполнения <auto_key> <cache>(expr) <primary_index_lookup>(query fragment) outer_tablessemi join (inner_tables) /* select#N */ select_stmt
  15. 15. EXPLAIN SELECT city.nameFROM country JOIN city ON countrycode= code WHERE continent='Europe' ORDER BY city.population DESC LIMIT 5G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: city type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4079 Extra: Using filesort *************************** 2. row *************************** id: 1 select_type: SIMPLE table: country type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 3 ref: test.city.CountryCode rows: 1 Extra: Using where
  16. 16. Результат EXPLAIN id - идентификатор результата select_ type - тип запроса: • SIMPLE - простой запрос (без UNION и без подзапросов); • PRIMARY - внешний запрос по отношению к подзапросу или первый запрос в объединении; • UNION - второй или последующиезапросы в объединении (UNION); • DEPENDENT UNION - второй или последующиезапросы в объединении (UNION), зависящиеот внешнего запроса; • UNION RESULT - отдельная строчкадля результатаобъединения; • DERIVED - подзапрос, размещенный в области FROM. • SUBQUERY, DEPENDENT SUBQUERY - подзапрос или зависимый от внешнего запросаподзапрос; • MATERIALIZED – материализация подзапроса
  17. 17. Результат EXPLAIN table - имя таблицы
  18. 18. Результат EXPLAIN
  19. 19. Результат EXPLAIN
  20. 20. Пример SELECT actor_id, (SELECT 1 FROM sakila.film_actor WHERE film_actor.actor_id = der_1.actor_id LIMIT 1) FROM ( SELECT actor_id FROM sakila.actor LIMIT 5 ) ASt1 UNION ALL SELECT film_id, (SELECT @var1 FROM sakila.rental LIMIT 1) FROM ( SELECT film_id, (SELECT 1 FROM sakila.storeLIMIT 1) FROM sakila.film LIMIT 5 ) ASt2;
  21. 21. Результат EXPLAIN type- тип доступак таблице: NULL - результат запросаможет быть получен без обращения к таблицеили индексу. system - специальный способ обращения к таблицам, содержащим только одну строку; const - запрос выполняется по уникальному ключу и приводит к формированию неболее, чем одной строки; eq_ref - запрос выполняется по уникальному ключу и приводит к формированию неболее, чем одной строки для каждого значения данных из внешнего запроса; ref - запрос выполняется с использованием неуникального индекса или с использованием левой части уникального индекса(которая самапо себеявляется неуникальным индексом);
  22. 22. type продолжение ref_or_null - аналогично типу ref, но в случае, если ключ допускает значения NULL; index_merge– использует несколько индексов. unique_subquery - подзапрос в области IN заменяется на дополнительноеусловиев части WHERE, осуществляющее функцию просмотраиндекса; в этом случаенет накладных расходов навыполнениеподзапроса. Работает только для подзапросов видаvalueIN (SELECT primary_key FROM single_tableWHERE some_expr); index_subquery - аналогично unique_subquery, но без требования уникальности индекса. Работает для подзапросов видаvalueIN (SELECT key_column FROM single_tableWHERE some_expr);
  23. 23. type продолжение range- индекс используется для операций неравенства(>, <, >=, <=, LIKE, BETWEEN); index - относится к двум типам доступа: (а) всеколонки, используемыев запросе, присутствуют в индексе, поэтому запрос может быть выполнен без обращения к данным таблицы, (б) обход таблицы производится в порядке, заданном индексом; ALL - производится полный скан таблицы (FTS- full tablescan).
  24. 24. Результат EXPLAIN key - индекс, который решено использовать (USE INDEX, IGNORE INDEX); key_len - длинаиндексаили используемой части индексав байтах; ref - если тип доступак таблицеимеет одно из следующих значений (eq_ref, ref, ref_or_null, index_subquery, unique_subquery), то поле содержит: • именаколонок другой таблицы, используемыепри обращении к индексу • const, если обращениек индексу производится по заданному константному значению • func, если значение, по которому производится обращениек индексу, является результатом функции. В остальных случаях полепринимает значениеnull;
  25. 25. Результат EXPLAIN rows- число строк, которыеMySQL ожидает перебрать для выполнения данного запроса(ANALYZE TABLE;) Extra- дополнительная информация: Using filesort - файловая сортировкарезультата(в памяти или на диске, в зависимости от объемаданных); Using temporary - созданиевременной таблицы (в памяти или на диске, в зависимости от объемаданных и значения минимальной из переменных max_heap_table_sizeи tmp_table_size); Using index - всеколонки, используемыев запросе, присутствуют в индексе, поэтому запрос может быть выполнен без обращения к данным таблицы (частный случай (а) типадоступаindex);
  26. 26. Профилирование select c1 from t1 where(c1,c11) in (select c2,c22 fromt2 wherec2>1 and c22<20)          id: 2 select_type: DEPENDENT SUBQUERY     table: t2      type: index_subquery SET profiling=1; SELECT ... SELECT STATE, COUNT(*), FORMAT(SUM(DURATION), 6) AS DURATION     FROM INFORMATION_SCHEMA.PROFILING     WHERE QUERY_ID = 1 GROUPBY STATE;
  27. 27. Профилирование
  28. 28. Сортировка может использовать индекс: • левый префикс, если нет where, join • если join, то только столбцы из 1ой таблицы • сортировкав одном направлении ORDER BY rand() GROUPBY x ORDER BY null ORDER BY id LIMIT 10000, 10
  29. 29. пример продолжение
  30. 30. ORDER BY + LIMIT
  31. 31. ORDER BY + LIMIT
  32. 32. Сортировка
  33. 33. Неравенства select .. whereA<10 and B<20 and C=5; секционирование (C,A) или (C,B) исключить одно из условий
  34. 34. Улучшения EXPLAIN EXPLAIN для INSERT/UPDATE/DELETE SHOW EXPLAIN JSON формат для EXPLAIN ANALYZE statement..
  35. 35. SHOW EXPLAIN show processlist; SHOW EXPLAIN FOR <thread_id>; show warnings; -- показывает запрос возможность сохранить в лог медленных запросов [mysqld] log-slow-verbosity=query_plan,explain
  36. 36. EXPLAIN format=json
  37. 37. Спасибо за внимание /вопросы ответы SQLinfo.ru/forum/

×