Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

8,490 views

Published on

Индексы
- типы индексов;
- типы доступа к таблице;
- составные индексы (когда они работают);
- получение информации об индексе (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. использование пользовательских переменных.

Published in: Engineering
  • Be the first to comment

Основы индексирования и расширенные возможности 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/

×