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