Statistics

Using Statistical Data

MySQL Native Driver поддерживает сбор статистики по взаимодействию клиента с сервером. Статистика собирается с двух основных точек:

  • Клиентская статистика

  • Статистика соединения

Если вы используете расширение mysqli, эта статистика доступна с помощью двух функций, обращающихся к API:

Замечание:

Статистика аггрегируется со всех расширений использующих MySQL Native Driver. К примеру, если подключить и ext/mysql и ext/mysqli через MySQL Native Driver, как вызовы функций ext/mysql так и ext/mysqli будут внесены в общую статистику. Возможность разделить статистику в зависимости от использованного расширения отсутствует. Вы можете сконфигурировать драйвера PDO MySQL, ext/mysql и ext/mysqli для опционального использования MySQL Native Driver. При этом, все три расширения будут изменять статистику.

Доступ к клиентской статистике

Для получения клиентской статистике необходимо выполнить функцию mysqli_get_client_stats(). Функция вызывается без параметров.

Функция возвращает ассоциативный массив, использующий в качестве ключей названия метрик статистики и в качестве значения этих метрик, собственно, значения.

Также клиентская статистика доступна с помощью функции phpinfo().

Доступ к статистике соединения

Для получения статистики соединения, выполните функцию mysqli_get_connection_stats(), передав в качестве параметра ресурс соединения.

Функция возвращает ассоциативный массив, использующий в качестве ключей названия метрик статистики и в качестве значения этих метрик, собственно, значения.

Буферизованные и небуферизованные результирующие наборы

Результирующие наборы могут быть буферизованными и небуферизованными. При использовании настроек по умолчанию, ext/mysql и ext/mysqli работают с буферизованными результирующими наборами при использовании нормальных (не подготовленных) запросов. Буферизованные результирующие наборы кешируются на стороне клиента. После выполнения запроса, все результаты передаются на клиента, где сохраняются в кеше. Преимущество буферизованных запросов в том, что сразу высвобождаются серверные ресурсы, связанные с хранением результирующего набора.

Небуферизованные результирующие наборы, с другой стороны, сохраняются на сервере гораздо дольше. Если вы хотите сократить потребление памяти на клиенте, но при этом нагрузить сервер, используйте небуферизованные результирующие наборы. Если узким местом в вашей системе является сервер баз данных, то вам стоит задуматься о скорейшем перемещении орезультатов на клиента. Обычно клиенты масштабируются гораздо легче, чем сервера БД. Нагрузка ложится не только на память, но и на прочие ресурсы, которые должна поддерживать база данных для обслуживания соединения, такие как открытые файловые дескрипторы и нити исполнения.

Подготовленные запросы по умолчанию используют небуферизованные результирующие наборы. В любом случае, вы можете использовать функцию mysqli_stmt_store_result() для буферизации результатов.

Статистика возвращаемая MySQL Native Driver

Следующая таблица демонстрирует список возвращаемой функциями mysqli_get_client_stats() и mysqli_get_connection_stats() статистики.

Статистика mysqlnd: Сеть
Метрика Область применения Описание Замечания
bytes_sent Соединение Количество байт переданных от PHP на сервер MySQL Может использоваться для проверки эффективности протокола сжатия
bytes_received Соединение Количество байт полученных от сервера MySQL Может использоваться для проверки эффективности протокола сжатия
packets_sent Соединение Количество пакетов посланых от клиента серверу MySQL Используется для отладки реализации клиент-серверного протокола
packets_received Соединение Количество пакетов принятых клиентом от сервера MySQL Используется для отладки реализации клиент-серверного протокола
protocol_overhead_in Соединение накладные расходы клиент-серверного протокола MySQLв байтах для входящего траффика. на данный момент только заголовок пакета (4 байта) считается за накладные расходы. protocol_overhead_in = packets_received * 4 Используется для отладки реализации клиент-серверного протокола
protocol_overhead_out Соединение MySQL Client Server protocol overhead in bytes for outgoing traffic. Currently only the Packet Header (4 bytes) is considered as overhead. protocol_overhead_out = packets_sent * 4 Используется для отладки реализации клиент-серверного протокола
bytes_received_ok_packet Соединение Общее количество байт принятых ОК-пакетов клиент-серверного протокола MySQL. OK-пакеты могут содержать статусные сообщения. Длина статусных сообщений может меняться, следовательно размер ОК-пакетов не фиксирована. Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_ok Соединение Количество принятых OK-пакетов Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_eof_packet Соединение Общее количество байт принятых EOF-пакетов. Размер EOF-пакета может изменяться в зависимости от версии сервера. Также, EOF-пакеты могут использоваться как транспорт для сообщений об ошибках. Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_eof Соединение Количество принятых EOF-пакетов. Как и для прочей статистики по пакетам, это число может увеличиваться каждый раз, когда PHP не получает ожидаемый пакет, а, к примеру, получае сообщение об ошибке. Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_rset_header_packet Соединение Общее количество байт принятых заголовочных пакетов результирующих наборов. Размер пакетов зависит от полезной нагрузки (LOAD LOCAL INFILE, INSERT, UPDATE, SELECT, сообщение об ошибке). Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_rset_header Соединение Количество пакетов заголовков результирующих наборов. Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_rset_field_meta_packet Соединение Общий размер в байтах полученных пакетов с метаданными результирующих наборов (информации о столбцах). Естественно размер каждого пакета индивидуален. Эти пакеты могут выступать транспортом для ошибок и EOF-пакетов в случае COM_LIST_FIELDS. Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_rset_field_meta Соединение Общее количество полученных пакетов с метаданными результирующих наборов (информации о столбцах). Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_rset_row_packet Соединение Общий размер в байтах полученных пакетов с данными результирующего набора. Эти пакеты могут служить транспортом для ошибок и в качестве EOF-пакетов. Вы можете вычислить количество ошибок и EOF-пакетов отняв rows_fetched_from_server_normal и rows_fetched_from_server_ps от bytes_received_rset_row_packet. Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_rset_row Соединение Кодичество пакетов с данными результирующих наборов и их суммарный объем в байтах. Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_prepare_response_packet Соединение Общий размер в байтах ОК-пакетов инициализации подготовленных запросов. (инициализирующие пакеты подготовленных запросов). Эти пакеты могут выступать транспортом для ошибок. Рзмер пакета зависит от версии Mysql: 9 байт для MySQL4.1 и 12 байт начиная с 5.0. Нет надежного способа узнать количество ошибок. Вы можете определить, что случилась ошибка, если, наример, вы работаете с MySQL 5.0 или новее, а bytes_received_prepare_response_packet != packets_received_prepare_response * 12. Также смотрите ps_prepared_never_executed, ps_prepared_once_executed. Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_prepare_response Соединение Количество полученных ОК-пакетов для инициализации подготовленных запросов. Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_change_user_packet Соединение Общий размер в байтах полученных пакетов COM_CHANGE_USER. Пакеты могут служить транспортом для ошибок и EOF-пакетов. Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_change_user Соединение Количество принятых пакетов COM_CHANGE_USER Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_sent_command Соединение Количество команд посланных от PHP серверу MySQL. Возможность узнать, какие конкретно и в каких количествах посылались команды отсутствует. Лучшее, для чего вы можете использовать эту метрику, это проверять, что посылает команды серверу MySQL и поддержка MySQL в PHP не запрещена. Также отсутствует возможность определить количество ошибок, возникших при отправке этих команд. Единственная опозноваемая ошибка - это command_buffer_too_small (смотрите ниже). Используется для отладки реализации клиент-серверного протокола
bytes_received_real_data_normal Соединение Количество байт полезной нагрузки извлеченной клиентом PHP из mysqlnd с использованием текстового протокола. Это актуальный размер данных содержащихся в результирующем наборе, которые клиент PHP уже загрузил. Обратите внимание, что хоть возможно mysqlnd забрал и полный результирующий набор с сервера MySQL, но в этой метрике учитываются только данные уже полученные клиентом PHP от mysqlnd. К примеру, следующий код увеличит значение метрики:
$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->fetch_assoc();
$res->close();

Каждая операция извлечения увеличивает это число.

Статистика не изменится, если результирующий набор был только буферизован, но не извлечен, как в этом примере:

$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->close();

Эта статистика доступна с PHP версии 5.3.4.

bytes_received_real_data_ps Соединение Количество байт полезной нагрузки, извлеченной клиентом PHP из mysqlnd используя подготовленные запросы. Это размер только тех данных, которые были извлечены клиентом PHP. Значение метрики не будет увеличиваться если клиент PHP не будет запрвшивать эти данные. Обратите внимание, что хоть возможно mysqlnd забрал и полный результирующий набор с сервера MySQL, но в этой метрике учитываются только данные уже полученные клиентом PHP от mysqlnd. Также смотрите bytes_received_real_data_normal. Эта метрика доступна с PHP версии 5.3.4.

Результирующий набор

Статистика mysqlnd: результирующий набор
Метрика Область применения Описание Замечания
result_set_queries Соединение Количество запросов, по которым был создан результирующий набор. Пример запросов, создающих результирующий набор: SELECT, SHOW. Статистика не будет увеличиваться в случае ошибки чтения заголовочного пакета результирующего набора. Вы можете использовать эту метрику, как опосредованный счетчик выполненых запросов, например для обнаружения клиента, создающего большую нагрузку на БД.
non_result_set_queries Соединение Количество запросов, по которым не был создан результирующий набор. Пример запросов, не создающих результирующий набор: INSERT, UPDATE, LOAD DATA. Статистика не будет увеличиваться в случае ошибки чтения заголовочного пакета результирующего набора. Вы можете использовать эту метрику, как опосредованный счетчик выполненых запросов, например для обнаружения клиента, создающего большую нагрузку на БД.
no_index_used Соединение Количество запросов, создающих результирующий набор, но не использовавших индексы (также смотрите опцию запуска mysqld –log-queries-not-using-indexes). Если вы хотите получать отчеты о подобных запросах, вы можете использовать mysqli_report(MYSQLI_REPORT_INDEX) для того, чтобы ext/mysqli выбрасывал исключение. Если вы предпочитаете просто предупреждение, используйте mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT).  
bad_index_used Соединение Количество запросов, создающих результирующий набор, но не использовавших хорошие индексы (также смотрите опцию запуска mysqld –log-slow-queries). Если вы хотите получать отчеты о подобных запросах, вы можете использовать mysqli_report(MYSQLI_REPORT_INDEX)для того, чтобы ext/mysqli выбрасывал исключение. Если вы предпочитаете просто предупреждение, используйте mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT)
slow_queries Соединение SQL-запросы, выполнявшиеся долешь чем long_query_time секунд и потребовавшие перебора более чем min_examined_row_limit строк. Не извлекается с помощью mysqli_report()
buffered_sets Соединение Количество буферезированных результирующих наборов возвращенных нормальными запросами. Нормальные, здесь и дальше значит не подготовленные. Примеры вызовов API, буферизующих результирующий набор на клиенте: mysql_query(), mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result(). Буферизация результирующего набора на клиенте гарантирует, что серверные ресурсы будут освобождены так быстро, как возможно и делает позиционирование более простым. Плохая новость в том, что это будет стоит дополнительного расхода памяти на клиенте. Обратите внимание, что mysqlnd (в отличие от клиентской библиотеки MySQL) зависит от ограничений PHP на память, поскольку использует внутренний менеджер памяти PHP. Это является одной из причин, почему memory_get_usage() при использовании mysqlnd показывает большие значение, чем при использовании клиенктской библиотеки MySQL. memory_get_usage() не замеряет потребление памяти клиентской библиотекой MySQL, поскольку он не использует внутренний менеджер памяти PHP.
unbuffered_sets Соединение Количество небуферизованных результирующих наборов возвращенных нормальными (не подготовленными) запросами. Примеры вызовов API, не буферизующих результирующий набор на клиенте: mysqli_use_result()
ps_buffered_sets Соединение Количество буферизованных результирующих наборов возвращенных подготовленными запросами. По умолчанию, подготовленные запросы не буферизируются. Примеры вызовов API, буферизующих результирующий набор на клиенте: mysqli_stmt_store_result
ps_unbuffered_sets Соединение Количество небуферизованных результирующих наборов возвращенных подготовленными запросами. По умолчанию, подготовленные запросы не буферизируются.
flushed_normal_sets Соединение Количество результирующих наборов возвращенных нормальными (не подготовленными) запросами с непрочтенными данными, которые были обнулены прозрачно для вас. Подобное происходит только с небуферизированными результирующими наборами. Небуферизированные результирующие наборы должны быть полностью извлечены, прежде чем будет возможно запустить новый запрос в том же соединении с MySQL, в противном случае произойдет ошибка. Если приложение не извлекло все строки небуферизированного результирующего набора, mysqlnd принудительно извлечет его, чтобы освободить ресурсы сервера. Также смотрите rows_skipped_normal и rows_skipped_ps. Возможные причины, ведущие к принудительному обнулению:
  • Ошибка клиентского приложения

  • Клиент перестал извлекать записи, так как нашел, что искал, но результирующий набор еще не был извлечен до конца

  • Аварийное завершение клиентского приложения

flushed_ps_sets Соединение Количество результирующих наборов возвращенных подготовленными запросами с непрочтенными данными, которые были обнулены прозрачно для вас. Подобное происходит только с небуферизированными результирующими наборами. Небуферизированные результирующие наборы должны быть полностью извлечены, прежде чем будет возможно запустить новый запрос в том же соединении с MySQL, в противном случае произойдет ошибка. Если приложение не извлекло все строки небуферизированного результирующего набора, mysqlnd принудительно извлечет его, чтобы освободить ресурсы сервера. Также смотрите rows_skipped_normal и rows_skipped_ps. Возможные причины, ведущие к принудительному обнулению:
  • Ошибка клиентского приложения

  • Клиент перестал извлекать записи, так как нашел, что искал, но результирующий набор еще не был извлечен до конца

  • Аварийное завершение клиентского приложения

ps_prepared_never_executed Соединение Количество подготовленных, но не запущенных запросов. Подготовленные запросы потребляют серверные ресурсы. Вы не должны подготавливать запросы, если не будете их запускать.
ps_prepared_once_executed Соединение Количество подготовленных запросов, запущенных только один раз. Главная идея подготовленных запросов в том, что один и тот же запрос будет запускаться несколько раз, но, возможно, с другими параметрами. Это позволяет сэкономить на подготовке запросов, позволяя произвести разбор запроса только один раз, а потом просто подставлять в него параметры и запускать. При подготовке запроса происходит кеширование результата, например можно многократно использовать дерево разбора, созданное один раз на жтапе подготовки. Если же вы запускаете подготовленный запрос всего один раз, то никакого выйгрыша по сравнению с нормальными запросами не будет, даже наоборот, будут дополнительные накладные расходы на кеширование подготовленного запроса. Таким образом, подготовленные запросы, которые используются всего один раз, ведут к ухудшению производительности.
rows_fetched_from_server_normal, rows_fetched_from_server_ps Соединение Общее количество успешно извлеченных строк из базы MySQL, независимо от того, использованы они были приложением или нет. Часть строк могут не извлекаться приложением, но при этом принудительно обнуляться. Также смотрите packets_received_rset_row
rows_buffered_from_client_normal, rows_buffered_from_client_ps Соединение Общее количество успешно буферизованных строк, полученных при выполнении "нормальных" запросов. Это количество строк, извлеченных из MySQL и буферизованных на клиенте. Обратите внимание, что существует две независимые метрики для буферизованных строк и (переданых от MySQL в буфер mysqlnd) и строк, прочтенных приложением (переданных из буфера mysqlnd клиентскому приложению). Если количество буферизованных строк больше чем число извлеченных клиентом, то стоит обратить внимание на клиентские запросы, так как они извлекают больше данных, чем им на самом деле нужно. Пример запросов, буферизующих результирующие наборы: mysqli_query(), mysqli_store_result()
rows_fetched_from_client_normal_buffered, rows_fetched_from_client_ps_buffered Соединение Общее количество извлеченных клиентов строк из буферизованных результирующих наборов для любого типа запросов.  
rows_fetched_from_client_normal_unbuffered, rows_fetched_from_client_ps_unbuffered Соединение Total number of rows fetched by the client from a unbuffered result set created by a "normal" query or a prepared statement.  
rows_fetched_from_client_ps_cursor Соединение Общее количество извлеченных клиентов строк из небуферизованных результирующих наборов для любого типа запросов.  
rows_skipped_normal, rows_skipped_ps Соединение Зарезервированно для использования в будущем и в данный момент не поддерживается  
copy_on_write_saved, copy_on_write_performed Процесс Если используется mysqlnd: переменные, возвращенные расширением, указывающие на внутренний сетевой буфер результатов mysqlnd. если вы не меняли переменные, извлеченные данные будут сохранены в памяти один раз. если вы меняли переменные, mysqlnd выполнит копирование при записи для защиты внутренних сетевых буферов результата от изменения. Если используется клиентская библиотека MySQL: вы всегда держите извлеченные данные в памяти в двух экземплярах. Один раз во внутренних буферах клиентской библиотеки MySQL, и еще один раз в переменных, возвращенных расширением. В теории, mysqlnd может до 40% сократить потребление памяти. В любом случае помните, что эту экономию не удастся замерить с помощью memory_get_usage().  
explicit_free_result, implicit_free_result Соединение, процесс (только на стадии очистки подготовленных запросов) Общее количество высвобожденных результирующих наборов. Очистка всегда производится явно, но для результирующих наборов, созданных инициализирующими командами, например mysqli_options(MYSQLI_INIT_COMMAND , ...)
proto_text_fetched_null, proto_text_fetched_bit, proto_text_fetched_tinyint proto_text_fetched_short, proto_text_fetched_int24, proto_text_fetched_int proto_text_fetched_bigint, proto_text_fetched_decimal, proto_text_fetched_float proto_text_fetched_double, proto_text_fetched_date, proto_text_fetched_year proto_text_fetched_time, proto_text_fetched_datetime, proto_text_fetched_timestamp proto_text_fetched_string, proto_text_fetched_blob, proto_text_fetched_enum proto_text_fetched_set, proto_text_fetched_geometry, proto_text_fetched_other Соединение Общее количество столбцов определенного типа, извлеченных нормальными запросами (текстовый протокол MySQL). Связка метаданных C API / MySQL с именами метрик статистики:
  • MYSQL_TYPE_NULL - proto_text_fetched_null

  • MYSQL_TYPE_BIT - proto_text_fetched_bit

  • MYSQL_TYPE_TINY - proto_text_fetched_tinyint

  • MYSQL_TYPE_SHORT - proto_text_fetched_short

  • MYSQL_TYPE_INT24 - proto_text_fetched_int24

  • MYSQL_TYPE_LONG - proto_text_fetched_int

  • MYSQL_TYPE_LONGLONG - proto_text_fetched_bigint

  • MYSQL_TYPE_DECIMAL, MYSQL_TYPE_NEWDECIMAL - proto_text_fetched_decimal

  • MYSQL_TYPE_FLOAT - proto_text_fetched_float

  • MYSQL_TYPE_DOUBLE - proto_text_fetched_double

  • MYSQL_TYPE_DATE, MYSQL_TYPE_NEWDATE - proto_text_fetched_date

  • MYSQL_TYPE_YEAR - proto_text_fetched_year

  • MYSQL_TYPE_TIME - proto_text_fetched_time

  • MYSQL_TYPE_DATETIME - proto_text_fetched_datetime

  • MYSQL_TYPE_TIMESTAMP - proto_text_fetched_timestamp

  • MYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING, MYSQL_TYPE_VARCHAR - proto_text_fetched_string

  • MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB - proto_text_fetched_blob

  • MYSQL_TYPE_ENUM - proto_text_fetched_enum

  • MYSQL_TYPE_SET - proto_text_fetched_set

  • MYSQL_TYPE_GEOMETRY - proto_text_fetched_geometry

  • Любые не перечисленные MYSQL_TYPE_* - proto_text_fetched_other

Обратите внимение, что константы типов MYSQL_* могут не ассоциироваться с одинаковыми столбцами SQL для разных версий MySQL.

proto_binary_fetched_null, proto_binary_fetched_bit, proto_binary_fetched_tinyint proto_binary_fetched_short, proto_binary_fetched_int24, proto_binary_fetched_int, proto_binary_fetched_bigint, proto_binary_fetched_decimal, proto_binary_fetched_float, proto_binary_fetched_double, proto_binary_fetched_date, proto_binary_fetched_year, proto_binary_fetched_time, proto_binary_fetched_datetime, proto_binary_fetched_timestamp, proto_binary_fetched_string, proto_binary_fetched_blob, proto_binary_fetched_enum, proto_binary_fetched_set, proto_binary_fetched_geometry, proto_binary_fetched_other Соединение Общее количество столбцов определенного типа, извлеченных подготовленными запросами (бинарный протокол MySQL). Связь типов с proto_text_* смотри в предыдущем пункте.
Статистика mysqlnd: Соединение
Метрика Область применения Описание Замечания
connect_success, connect_failure Соединение Общее количество удачных/неудачных попыток соединения. Переиспользованные и прочие типы соединений включаются.
reconnect Процесс Общее количество попыток выполнить real_connect на уже открытом соединении. Следующий код $link = new mysqli(...); $link->real_connect(...) приведет к пересоединению. Но $link = new mysqli(...); $link->connect(...) не приведет, так как $link->connect(...) принудительно закроет существующее соединение перед созданием нового.
pconnect_success Соединение Общее количество успешных попыток открыть постоянное соединение Обратите внимание, что connect_success содержит суммарное количество обычных и постоянных соединений. Так что количество обычных соединений можно вычислить так: connect_success - pconnect_success.
active_connections Соединение Общее количество активных соединений, как обычных, так и постоянных.  
active_persistent_connections Соединение Общее количество активных постоянных соединений. Общее количество активных непостоянных соединений равно: active_connections - active_persistent_connections.
explicit_close Соединение Общее количество явно закрытых соединений (только ext/mysqli). Пример кода, в котором явно закрывается соединение:
$link = new mysqli(...); $link->close(...)
$link = new mysqli(...); $link->connect(...)
implicit_close Соединение Общее количество неявно закрытых соединений (только ext/mysqli). Пример кода, в котором соединение закрывается не явно:
  • $link = new mysqli(...); $link->real_connect(...)

  • unset($link)

  • Постоянное соединение: соединение было создано с помощью real_connect и, возможно, с неизвестным набором опций - закрывается неявно для предотвращения переиспользования соединения с неизвестным набором опций

  • Постоянное соединение: ping/change_user завершаются с ошибкой и ext/mysqli закрывает соединение

  • Окончание работы скрипта: закрываются соединения, не закрытые пользователем явно

disconnect_close Соединение Ошибки соединения возвращаемые при вызове C API mysql_real_connect() во время установления соединения. Вызывается disconnect_close, потому, что идентификатор соединения, переданный в вызов C API, должен быть закрыт.
in_middle_of_command_close Процесс Соединение закрыто во время исполнения команды (результирующий набор не извлечен, после запуска запроса и до получения ответа, во время извлечения данных, во время загрузки данных с помощью LOAD DATA). если вы не используете асинхронные запросы, подобное может случиться только если работа скрипта неожиданно прервалась и PHP автоматически закрыл соединение.
init_command_executed_count Соединение Общее количество запусков инициализирующих команд, к примеру mysqli_options(MYSQLI_INIT_COMMAND , ...). Количество успешно запущенных команд равно init_command_executed_count - init_command_failed_count.
init_command_failed_count Соединение Общее количество неудачных инициализирующих команд.  
Статистика mysqlnd: Команды COM_*
Метрика Область применения Описание Замечания
com_quit, com_init_db, com_query, com_field_list, com_create_db, com_drop_db, com_refresh, com_shutdown, com_statistics, com_process_info, com_connect, com_process_kill, com_debug, com_ping, com_time, com_delayed_insert, com_change_user, com_binlog_dump, com_table_dump, com_connect_out, com_register_slave, com_stmt_prepare, com_stmt_execute, com_stmt_send_long_data, com_stmt_close, com_stmt_reset, com_stmt_set_option, com_stmt_fetch, com_daemon Соединение Общее количество попыток послать одну из COM_* команд из PHP серверу MySQL.

Метрика увеличивается после проверки синтаксиса команды и непосредственно перед отсылкой соответствующего пакета серверу MySQL. Если mysqlnd не удалось послать пакет, метрика не будет уменьшина. В случае неудачной посылки mysqlnd вернет предупреждение Error while sending %s packet. PID=%d.

Примеры использования:

  • Отследить, что PHP посылает определенные команды серверу, например, что клиент шлет COM_PROCESS_KILL

  • Посчитать среднее количество запусков подготовленных запросов, сравнив COM_EXECUTE с COM_PREPARE

  • Проверить, что PHP исполняет неподготовленные запросы, убедившись, что COM_QUERY равно нулю

  • Определить скрипт PHP, выполняющий множество запросов, проверив COM_QUERY и COM_EXECUTE

Прочее

Статистика mysqlnd: Прочее
Метрика Область применения Описание Замечания
explicit_stmt_close, implicit_stmt_close Процесс Общее количество закрытых подготовленных запросов. Закрытие всегда происходит явно, за исключением ошибок при подготовке.
mem_emalloc_count, mem_emalloc_ammount, mem_ecalloc_count, mem_ecalloc_ammount, mem_erealloc_count, mem_erealloc_ammount, mem_efree_count, mem_malloc_count, mem_malloc_ammount, mem_calloc_count, mem_calloc_ammount, mem_realloc_count, mem_realloc_ammount, mem_free_count Процесс Вызовы менеджера памяти. Только для разработчиков.
command_buffer_too_small Соединение Количество расширений сетевого командного буфера в процессе отправки команды от PHP серверу MySQL.

mysqlnd выделяет внутренний командный/сетевой буфер размера mysqlnd.net_cmd_buffer_size (php.ini) байт для каждого соединения. Если команда клиент-серверного протокола MySQL, к примеру COM_QUERY (обычный запрос), не помещается в него, mysqlnd увеличивает размер буфера до необходимого размера. Каждый раз, когда размер буфера увеличивается длясоединения, command_buffer_too_small увеличивается на единицу.

Если mysqlnd увеличивает размер буфера более его начального размера mysqlnd.net_cmd_buffer_size (php.ini) практически для каждого соединения, вам стоит задуматься об изменении этого значения.

Размер буфера по умолчанию равен 2048 байт в PHP 5.3.0. В будущих версиях по умолчанию будет 4kB или больше. Это значение можно поменять в php.ini изменив значение ключа mysqlnd.net_cmd_buffer_size или используя mysqli_options(MYSQLI_OPT_NET_CMD_BUFFER_SIZE, int size).

рекомендуется устанавливать размер буфера не менее 4096 байт, потому как mysqlnd также использует его при чтении определенных комуникационных пакетов от сервера MySQL. В PHP 5.3.0, mysqlnd не увеличивает буфер, если MySQL шлет пакет больший текущего размера буфера. Из-за этого mysqlnd не может принять такой пакет и возвращает ошибку пользовательскому приложению. Есть только два варианта, когда размер пакета может быть более 2048 байт (значение mysqlnd.net_cmd_buffer_size по умолчанию в PHP 5.3.0) : пакет содержит очень длинное сообщение, либо если пакет содержит метаданные столбцов из COM_LIST_FIELD (mysql_list_fields()) и метаданные содержат данный о строковом столбце с очень длинным значением по умолчанию (>1900 байт). Ни одного сообщение о подобных проблемах не зафиксировано, но опасность есть.

Начиная с PHP 5.3.2, mysqlnd не позволяет задавать размер буфера меньше 4096 байт.

connection_reused