DB MySQL

Профилирование и оптимизация Sql запросов

Профилирование запросов

Профилирование запросов применяется для оценки производительности приложения. Для управления профилированием используйте profiling .

SET profiling = 1;

SHOW PROFILES отображает список самых последних запросов, отправленных на сервер. Размер списка контролируется profiling_history_size переменной сеанса, которая имеет значение по умолчанию 15. Максимальное значение - 100. Установка значения 0 имеет практический эффект отключения профилирования.

По умолчанию SHOW PROFILE отображает Query и Duration. SHOW PROFILE имеет необязательные type значения могут быть указаны для отображения определенных дополнительных типов информации:

  • ALL отображает всю информацию
  • BLOCK IO отображает количество операций ввода и вывода блока
  • CONTEXT SWITCHES отображает количество произвольных и непроизвольных переключений контекста
  • CPU отображает время использования ЦП пользователя и системы
  • IPC отображает количество отправленных и полученных сообщений
  • MEMORY в настоящее время не реализовано
  • PAGE FAULTS отображает количество основных и второстепенных ошибок страницы
  • SOURCE отображает имена функций из исходного кода вместе с именем и номером строки файла, в котором функция встречается
  • SWAPS отображает количество свопов
SHOW PROFILE ALL FOR QUERY 2; # Отображает всю информацию о втором запросе

Оптимизация запросов

Некоторые правила для работы с запросами, которые ускорят время выполнения:

  • Использовать подготовленные запросы.
  • Избегать запросов в цикле.
  • Избегать SELECT *
  • Проверить запрос в EXPLAIN. Если поиск идет часто по одному полю и у него нет индекса, то можно сделать индекс по этому полю.
  • Использовать LIMIT 1, когда нужна 1 строка.
  • В каждой таблице нужно поле id, которое будет PRIMARY KEY, AUTO_INCREMENT, а так же иметь тип INT.
  • Использовать NOT NULL, где это возможно.
  • При пакетной выборке в больших объемов данных не стоит использовать OFFSET . Подробнее о проблеме и решении можно почитать на habr.com

Explain, План выполнения

mysql> explain select cp.id, cp.name from products as p inner join product_types pt on p.type_id=pt.id;
+----+-------------+-------+--------+----------------------+----------------------+---------+-----------------------------+-------+--------------------------+
| id | select_type | table | type   | possible_keys        | key                  | key_len | ref                         | rows  | Extra                    |
+----+-------------+-------+--------+----------------------+----------------------+---------+-----------------------------+-------+--------------------------+
|  1 | SIMPLE      | pt    | index  | IDX_147342311664BC41 | IDX_147342311664BC41 | 5       | NULL                        | 52272 | Using where; Using index |
|  1 | SIMPLE      | p     | eq_ref | PRIMARY              | PRIMARY              | 4       | p.type_id                   |     1 | NULL                     |
+----+-------------+-------+--------+----------------------+----------------------+---------+-----------------------------+-------+--------------------------+

Количество строк EXPLAIN - это количество таблиц, участвующих в запросе, а значение столбцов результата:

  • id : уникальный идентификатор запроса
  • select_type : тип запроса
  • table : таблица запросов, которая может быть таблицей / представлением в базе данных или подзапросом из FROM
  • type : метод поиска данных
  • possible_keys : возможные индексы
  • key : окончательное решение использовать
  • key_len : количество байтов, используемых индексом запроса. Обычно чем меньше, тем лучше
  • ref : столбец или константа запроса
  • rows : количество сканируемых строк, оценка. Обычно чем меньше, тем лучше.
  • Extra : дополнительная информация

select_type :

  • SIMPLE — Простой запрос SELECT без подзапросов или UNION’ов
  • PRIMARY – данный SELECT – самый внешний запрос в JOIN’е
  • DERIVED – данный SELECT является частью подзапроса внутри FROM
  • SUBQUERY – первый SELECT в подзапросе
  • DEPENDENT SUBQUERY – подзапрос, который зависит от внешнего запроса
  • UNCACHABLE SUBQUERY – не кешируемый подзапрос (существуют определенные условия для того, чтобы запрос кешировался)
  • UNION – второй или последующий SELECT в UNION’е
  • DEPENDENT UNION – второй или последующий SELECT в UNION’е, зависимый от внешнего запроса
  • UNION RESULT – результат UNION’а

type :

  • null : может быть сделано без доступа к индексам и таблицам, пример:SELECT 1;
  • const : в таблице есть только одно совпадение, которое считывается как константа при декомпозиции плана запроса. Система является частным случаем константного типа.
  • eq_ref : используйте PRIMARY KEY или UNIQUE KEY для связанных запросов.
  • ref : запрос с использованием индекса, который позволяет дублировать
Авторизуйтесь, что бы оставить комментарий!