MySQL Native Driver поддерживает сбор статистики по взаимодействию клиента с сервером. Статистические данные собираются с двух основных точек:
При работе с модулем mysqli эти статистические данные получают через два API-вызова:
Замечание: Статистика агрегируется по всем расширениям, которые работают через драйвер MySQL Native Driver. Например, при настройке модуля mysqli и MySQL-драйвера модуля PDO на работу с драйвером MySQLnd вызовы функций модуля mysqli и вызовы методов класса PDO влияют на статистику. Невозможно узнать, насколько конкретный API-вызов модуля, который скомпилировали с драйвером MySQL Native Driver, повлиял на конкретную статистику.
Клиентскую статистику получают через вызов функции mysqli_get_client_stats().
Статистику соединения получают через вызов функции mysqli_get_connection_stats().
Обе функции возвращают ассоциативный массив, в котором метрики статистики — ключи, которые соответствуют статистическим данным.
Бо́льшая часть статистических данных связана с подключением, но отдельные данные связаны с процессом, и тогда это упоминается.
Следующая статистика выдается драйвером MySQL Native Driver:
bytes_sentbytes_receivedpackets_sentpackets_receivedprotocol_overhead_inprotocol_overhead_in = packets_received * 4
protocol_overhead_outprotocol_overhead_out = packets_received * 4
bytes_received_ok_packetЗамечание: Общий размер в байтах включает размер пакета заголовка — 4 байта, см. накладные расходы протокола.
packets_received_okbytes_received_eof_packetЗамечание: Общий размер в байтах включает размер пакета заголовка — 4 байта, см. накладные расходы протокола.
packets_received_eofbytes_received_rset_header_packetLOAD LOCAL INFILE, INSERT,
UPDATE, SELECT, сообщение об ошибке).
Замечание: Общий размер в байтах включает размер пакета заголовка — 4 байта, см. накладные расходы протокола.
packets_received_rset_headerbytes_received_rset_field_meta_packetЗамечание: Общий размер в байтах включает размер пакета заголовка — 4 байта, см. накладные расходы протокола.
packets_received_rset_field_metabytes_received_rset_row_packetrows_fetched_from_server_normal
и rows_fetched_from_server_ps
из метрики bytes_received_rset_row_packet.
Замечание: Общий размер в байтах включает размер пакета заголовка — 4 байта, см. накладные расходы протокола.
packets_received_rset_rowbytes_received_prepare_response_packetЗамечание: Общий размер в байтах включает размер пакета заголовка — 4 байта, см. накладные расходы протокола.
packets_received_prepare_responsebytes_received_change_user_packetЗамечание: Общий размер в байтах включает размер пакета заголовка — 4 байта, см. накладные расходы протокола.
packets_received_change_userpackets_sent_commandbytes_received_real_data_normalmysqlnd по текстовому протоколу.
Это размер фактических данных, которые содержатся в наборах результатов, которые
не исходят из подготовленных запросов и которые получил 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();
bytes_received_real_data_psmysqlnd по протоколу подготовленного запроса.
Это размер фактических данных, которые содержатся в наборах результатов, которые
не исходят из подготовленных запросов и которые получил PHP-клиент.
Модуль не увеличит значение, если PHP-клиент впоследствии не прочитает набор результатов.
Обратите внимание, что, хотя полный результирующий набор мог быть получен от MySQL-сервера
через драйвер mysqlnd, в этой статистике учитываются только фактические данные,
которые PHP-клиент получил от драйвера mysqlnd.
Смотрите также описание метрики bytes_received_real_data_normal.
result_set_queriesSELECT, SHOW.
Модуль не увеличивает значение метрики, если произойдет ошибка при чтении
пакета заголовка результирующего набора из строки.
Замечание: Этой статистикой пользуются как косвенным показателем количества запросов, которые PHP отправил на MySQL-сервер. Это помогает определить клиента, который вызывает высокую нагрузку на базу данных.
non_result_set_queriesINSERT, UPDATE, LOAD DATA.
Модуль не увеличивает значение метрики, если произойдет ошибка при считывании
пакета заголовка результирующего набора из строки.
Замечание: Этой статистикой пользуются как косвенным показателем количества запросов, которые PHP отправил на MySQL-сервер. Это помогает определить клиента, который вызывает высокую нагрузку на базу данных.
no_index_used--log-queries-not-using-indexes команды mysqld).
Замечание: Об этих запросах сообщают через исключение, для чего вызывают
mysqli_report(MYSQLI_REPORT_INDEX);. Вместо этого можно сообщить о них через предупреждения путём вызоваmysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);.
bad_index_used--log-slow-queries команды mysqld).
Замечание: Об этих запросах сообщают через исключение, для чего вызывают
mysqli_report(MYSQLI_REPORT_INDEX);. Вместо этого можно сообщить о них через предупреждения путём вызоваmysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);.
slow_querieslong_query_time,
и для проверки которых требовало как минимум такое количество строк,
которое задали в параметре min_examined_row_limit.
Не сообщается через функцию mysqli_report().
buffered_setsПримеры вызовов API, которые буферизуют наборы результатов на клиенте: mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result()
unbuffered_setsПримеры вызовов API, которые не буферизуют наборы результатов на клиенте: mysqli_use_result()
ps_buffered_setsПримеры вызовов API, которые буферизуют наборы результатов на клиенте: mysqli_stmt_store_result()
ps_unbuffered_setsflushed_normal_setsЗамечание: Модуль сбрасывает только небуферизованные наборы результатов. Небуферизованные результирующие наборы должны быть полностью получены перед выполнением нового запроса по соединению, иначе MySQL-сервер выдаст ошибку. Если приложение не извлекает все строки из небуферизованного результирующего набора, команда mysqlnd неявно извлекает результирующий набор, чтобы очистить строку. Смотрите также описание метрик
rows_skipped_normal,rows_skipped_ps.Некоторые причины неявного сброса:
- Ошибка клиентского приложения
- Клиент прекратил чтение данных, когда нашёл то, что искал, но заставил MySQL-сервер вычислять больше записей, чем требуется
- Клиентское приложение неожиданно остановилось
flushed_ps_setsЗамечание: Модуль сбрасывает только небуферизованные наборы результатов. Небуферизованные результирующие наборы должны быть полностью получены перед выполнением нового запроса по соединению, иначе MySQL-сервер выдаст ошибку. Если приложение не извлекает все строки из небуферизованного результирующего набора, команда mysqlnd неявно извлекает результирующий набор, чтобы очистить строку. Смотрите также описание метрик
rows_skipped_normal,rows_skipped_ps.Некоторые причины неявного сброса:
- Ошибка клиентского приложения
- Клиент прекратил чтение данных, когда нашёл то, что искал, но заставил MySQL-сервер вычислять больше записей, чем требуется
- Клиентское приложение неожиданно остановилось
ps_prepared_never_executedps_prepared_once_executedrows_fetched_from_server_normalrows_fetched_from_server_pspackets_received_rset_row.
rows_buffered_from_client_normalПримеры запросов, которые буферизуют результаты:
rows_buffered_from_client_psrows_buffered_from_client_normal,
но для подготовленных запросов.
rows_fetched_from_client_normal_bufferedrows_fetched_from_client_ps_bufferedrows_fetched_from_client_normal_unbufferedrows_fetched_from_client_ps_unbufferedrows_fetched_from_client_ps_cursorrows_skipped_normalrows_skipped_pscopy_on_write_savedcopy_on_write_performedexplicit_free_resultimplicit_free_resultproto_text_fetched_nullMYSQL_TYPE_NULL,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_nullMYSQL_TYPE_NULL,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_bitMYSQL_TYPE_BIT,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_bitMYSQL_TYPE_BIT,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_tinyintMYSQL_TYPE_TINY,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_tinyintMYSQL_TYPE_TINY,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_shortMYSQL_TYPE_SHORT,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_shortMYSQL_TYPE_SHORT,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_int24MYSQL_TYPE_INT24,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_int24MYSQL_TYPE_INT24,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_intMYSQL_TYPE_LONG,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_intMYSQL_TYPE_LONG,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_bigintMYSQL_TYPE_LONGLONG,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_bigintMYSQL_TYPE_LONGLONG,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_decimalMYSQL_TYPE_DECIMAL или MYSQL_TYPE_NEWDECIMAL,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_decimalMYSQL_TYPE_DECIMAL или MYSQL_TYPE_NEWDECIMAL,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_floatMYSQL_TYPE_FLOAT,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_floatMYSQL_TYPE_FLOAT,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_doubleMYSQL_TYPE_DOUBLE,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_doubleMYSQL_TYPE_DOUBLE,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_dateMYSQL_TYPE_DATE или MYSQL_TYPE_NEWDATE,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_dateMYSQL_TYPE_DATE или MYSQL_TYPE_NEWDATE,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_yearMYSQL_TYPE_YEAR,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_yearMYSQL_TYPE_YEAR,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_timeMYSQL_TYPE_TIME,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_timeMYSQL_TYPE_TIME,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_datetimeMYSQL_TYPE_DATETIME,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_datetimeMYSQL_TYPE_DATETIME,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_timestampMYSQL_TYPE_TIMESTAMP,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_timestampMYSQL_TYPE_TIMESTAMP,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING или MYSQL_TYPE_VARCHAR,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING или MYSQL_TYPE_VARCHAR,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_blobMYSQL_TYPE_TINY_BLOB,
MYSQL_TYPE_MEDIUM_BLOB,
MYSQL_TYPE_LONG_BLOB
или MYSQL_TYPE_BLOB,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_blobMYSQL_TYPE_TINY_BLOB,
MYSQL_TYPE_MEDIUM_BLOB,
MYSQL_TYPE_LONG_BLOB
или MYSQL_TYPE_BLOB,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_enumMYSQL_TYPE_ENUM,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_enumMYSQL_TYPE_ENUM,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_setMYSQL_TYPE_SET,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_setMYSQL_TYPE_SET,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_geometryMYSQL_TYPE_GEOMETRY,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_geometryMYSQL_TYPE_GEOMETRY,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_otherMYSQL_TYPE_*,
не перечисленных ранее,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
Замечание: Теоретически значение всегда должно равняться
0.
proto_binary_fetched_otherMYSQL_TYPE_*,
не включённых ранее,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
Замечание: Теоретически, значение всегда должно равняться
0.
connect_successЗамечание:
connect_successсодержит сумму успешных постоянных и непостоянных попыток подключения. Следовательно, количество успешных попыток непостоянного подключения равно разностиconnect_success - pconnect_success.
pconnect_successconnect_failurereconnectactive_connectionsЗамечание: Общее количество активных непостоянных соединений равно разности
active_connections - active_persistent_connections.
active_persistent_connectionsexplicit_closeПример #1 Примеры фрагментов кода, которые вызывают явное закрытие
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_closeПример #2 Примеры фрагментов кода, которые вызывают неявное закрытие
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_closemysql_real_connect при попытке
установить соединение.
in_middle_of_command_closeЕсли не выполняются асинхронные запросы, это должно произойти, только если PHP-приложение неожиданно завершилось, и PHP автоматически закрывает соединение.
init_command_executed_countmysqli_options(MYSQLI_INIT_COMMAND , $value).
Количество успешных запусков — разность
init_command_executed_count - init_command_failed_count.
init_command_failed_countСтатистика команд COM_*
com_quitcom_init_dbcom_querycom_field_listcom_create_dbcom_drop_dbcom_refreshcom_shutdowncom_statisticscom_process_infocom_connectcom_process_killcom_debugcom_pingcom_timecom_delayed_insertcom_change_usercom_binlog_dumpcom_table_dumpcom_connect_outcom_register_slavecom_stmt_preparecom_stmt_executecom_stmt_send_long_datacom_stmt_closecom_stmt_resetcom_stmt_set_optioncom_stmt_fetchcom_daemonCOM_*
на MySQL-сервер.
Значение метрики увеличивается после проверки строки и сразу
перед отправкой соответствующего пакета клиент-серверного протокола MySQL.
Если драйвер MySQLnd не сможет отправить пакет по сети, значение метрики не будет уменьшаться.
При сбое драйвер MySQLnd выдаёт PHP-предупреждение
Error while sending %s packet. PID=%d.
Пример #3 Примеры использования
Проверьте, отправляет ли PHP конкретные команды на MySQL-сервер, например:
проверьте, отправляет ли клиент команду COM_PROCESS_KILL
Вычислите среднее количество выполнений подготовленных операторов
путём сравнения команду COM_EXECUTE
с командой COM_PREPARE
Выясните, не запускал ли PHP неподготовленные SQL-запросы
путём проверки, равно ли значение команды COM_QUERY нулю
Определите PHP-скрипты, которые запускают чрезмерное количество SQL-запросов
путём проверки команд COM_QUERY
и COM_EXECUTE
explicit_stmt_closeimplicit_stmt_closeЗамечание: Подготовленный запрос всегда явно закрыт. Единственный раз, когда он закрывается неявно, — когда подготовка не удалась.
mem_emalloc_countmem_emalloc_ammountmem_ecalloc_countmem_ecalloc_ammountmem_realloc_countmem_realloc_ammountmem_efree_countmem_malloc_countmem_malloc_ammountmem_calloc_countmem_calloc_ammountmem_ealloc_countmem_ealloc_ammountmem_free_countcommand_buffer_too_smallCOM_QUERY
(обычный запрос) не помещается в буфер.
Каждый раз при расширении буфера для одного соединения
метрика command_buffer_too_small увеличивается на единицу.
Если драйверу MySQLnd приходится увеличивать размер буфера сверх первоначального размера,
который задали в байтах в опции mysqlnd.net_cmd_buffer_size,
почти для каждого соединения,
размер по умолчанию для буфера увеличивают, чтобы избежать перераспределения памяти.
connection_reused