webew
Войти » Регистрация
 
MySQL/MariaDB :: оптимизация

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

13 февраля 2010, 18:52

В MySQL с версии 5.0.37 появился удобный инструмент для профилирования запросов — директивы SHOW PROFILES и SHOW PROFILE.

Директива SHOW PROFILES показывает список запросов, выполненных в текущую сессию и время выполнения каждого запроса.
Число отображаемых запросов определяется переменной сессии profiling_history_size, которая имеет значение по умолчанию 15, максимальное 100. В список попадают все запросы кроме SHOW PROFILES и SHOW PROFILE, включая синтаксически неверные.

Обратите внимание: Директивы SHOW PROFILE и SHOW PROFILES поддерживаются в MySQL Community Server, начиная с версии 5.0.37, а в MySQL Enterprise только начиная с версии 5.1.

По умолчанию профилирование отключено, а переменная сессии profiling имеет значение 0. Для включения профилирования необходимо установить значение этой переменной равным 1:

mysql> set profiling=1;
Query OK, 0 rows affected (0.00 sec)

mysql> create table a1 (id int not null auto_increment);
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
mysql> create table a1 (id int not null auto_increment primary key);
Query OK, 0 rows affected (0.01 sec)

mysql> show profiles;
+----------+------------+--------------------------------------------------------------+
| Query_ID | Duration   | Query                                                        |
+----------+------------+--------------------------------------------------------------+
|        1 | 0.00010300 | create table a1 (id int not null auto_increment)             |
|        2 | 0.00443200 | create table a1 (id int not null auto_increment primary key) |
+----------+------------+--------------------------------------------------------------+

2 rows in set (0.00 sec)

Директива SHOW PROFILE показывает подробную информацию об этапах выполнения отдельного запроса.
По умолчанию, выводится информация о последнем запросе. Для указания на конкретный запрос используется опция FOR QUERY n, где значение n соответствует значению Query_ID из списка, формируемого директивой SHOW PROFILES.
В нашем примере команды SHOW PROFILE и SHOW PROFILE FOR QUERY 2 эквивалентны.

mysql> show profile;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| (initialization)     | 0.000039 |
| checking permissions | 0.00004  |
| creating table       | 0.004034 |
| After create         | 0.000294 |
| query end            | 0.000009 |
| freeing items        | 0.000012 |
| logging slow query   | 0.000004 |
+----------------------+----------+
7 rows in set (0.00 sec)

По умолчанию SHOW PROFILE показывает 2 колонки:

  • Status - состояние потока. Значение этой величины соответствует значению State, отображаемому директивой SHOW PROCESSLIST. Полный перечень возможных значений см в официальной документации.
  • Duration - время выполнения в секундах.
Обратите внимение
Профилирование действует в течении сессии. По завершении сесссии информация профайлинга теряется.

Информацию, аналогичную результату работы SHOW PROFILE, можно получить из таблицы PROFILING базы INFORMATION_SCHEMA. Например, следующие команды являются эквивалентными:

SHOW PROFILE FOR QUERY 2;

SELECT STATE, FORMAT(DURATION, 6) AS DURATION
FROM INFORMATION_SCHEMA.PROFILING
WHERE QUERY_ID = 2;

Ссылки


© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

huze

Почему материалы публикуются так редко? =(
15.02.2010, 21:10
Ответить
NO USERPIC

rgbeast

Неотъемлемое свойство творческого процесса - непредсказуемость, хотя вы конечно правы. Но можете помочь делу - предложить статью к публикации.
15.02.2010, 21:52
Ответить

1234ru

Интересно, почему присутствует строчка logging_slow_query, хотя весь запрос занимает меньше сотой секунды?
Просто проверка на то, что в лог писать не надо?
То, что не убивает нас, делает нас инвалидами.
11.03.2010, 03:00
Ответить
NO USERPIC

rgbeast

Он фиксирует вызов конкретного модуля, отвечающего за запись медленных запросов. Причем блок вызывается даже если log_slow_queries=OFF (видимо, чтобы убедиться, что от отключен).
11.03.2010, 10:35
Ответить

1234ru

У некоторых запросов львиную долю занимает либо Sending data, либо Statistics (несколько сотых секунды, тогда как все остальное - десятитысячные и меньше). Я нигде не смог найти информацию о том, что это такое.
Есть какие-нибудь идеи?

(Sending data большой даже когда соединяешься через сокет - я проверял; Statistics что такое - ума не приложу)
То, что не убивает нас, делает нас инвалидами.
06.04.2010, 20:59
Ответить
NO USERPIC

vasya

statistics
The server is calculating statistics to develop a query execution plan. If a thread is in this state for a long time, the server is probably disk-bound performing other work.


Sending data
The thread is processing rows for a SELECT statement and also is sending data to the client.


http://dev.mysql.com/doc/refman/5.0/en/general-thread-states.html
06.04.2010, 22:40
Ответить

1234ru

О, за ссылку спасибо! :)
(я как-то и не подумал, что это надо искать в Thread States)

Примерно так я и думал.
Правда, непонятно, почему так долго надо делать SELECT из индекса, ну ладно.. (видимо, индекс не в буфере)
То, что не убивает нас, делает нас инвалидами.
07.04.2010, 01:08
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: