MySQL Native Driver поддерживает сбор статистики по взаимодействию клиента с сервером. Статистические данные собираются с двух основных точек:
При работе с модулем mysqli эти статистические данные получают через два API-вызова:
Замечание: Статистика агрегируется по всем расширениям, которые используют драйвер MySQL Native Driver. Например, если модуль mysqli и драйвер PDO MySQL настроены на работу с драйвером MySQLnd, тогда вызовы функций модуля mysqli и вызовы методов класса PDO будут влиять на статистику. Нет способа узнать, насколько конкретный вызов API модуля, который скомпилировали с драйвером MySQL Native Driver, повлиял на конкретную статистику.
Клиентскую статистику получают через вызов функции mysqli_get_client_stats().
Статистику соединения получают через вызов функции mysqli_get_connection_stats().
Обе функции возвращают ассоциативный массив, в котором метрики статистики — ключи, которые соответствуют статистическим данным.
Бо́льшая часть статистических данных связана с подключением, но отдельные данные связаны с процессом, и тогда это упоминается.
Следующая статистика выдается драйвером MySQL Native Driver:
bytes_sent
bytes_received
packets_sent
packets_received
protocol_overhead_in
protocol_overhead_in = packets_received * 4
protocol_overhead_out
protocol_overhead_out = packets_received * 4
bytes_received_ok_packet
Замечание: Общий размер в байтах включает размер пакета заголовка (4 байта, см. накладные расходы протокола).
packets_received_ok
bytes_received_eof_packet
Замечание: Общий размер в байтах включает размер пакета заголовка (4 байта, см. накладные расходы протокола).
packets_received_eof
bytes_received_rset_header_packet
LOAD LOCAL INFILE
, INSERT
,
UPDATE
, SELECT
, сообщение об ошибке).
Замечание: Общий размер в байтах включает размер пакета заголовка (4 байта, см. накладные расходы протокола).
packets_received_rset_header
bytes_received_rset_field_meta_packet
Замечание: Общий размер в байтах включает размер пакета заголовка (4 байта, см. накладные расходы протокола).
packets_received_rset_field_meta
bytes_received_rset_row_packet
rows_fetched_from_server_normal
и rows_fetched_from_server_ps
из метрики bytes_received_rset_row_packet
.
Замечание: Общий размер в байтах включает размер пакета заголовка (4 байта, см. накладные расходы протокола).
packets_received_rset_row
bytes_received_prepare_response_packet
Замечание: Общий размер в байтах включает размер пакета заголовка (4 байта, см. накладные расходы протокола).
packets_received_prepare_response
bytes_received_change_user_packet
Замечание: Общий размер в байтах включает размер пакета заголовка (4 байта, см. накладные расходы протокола).
packets_received_change_user
packets_sent_command
bytes_received_real_data_normal
mysqlnd
по текстовому протоколу.
Это размер фактических данных, которые содержатся в наборах результатов, которые
не исходят из подготовленных запросов и которые получил PHP-клиент.
Обратите внимание, что, хотя полный результирующий набор мог быть получен от MySQL-сервера
через драйвер mysqlnd
, в этой статистике учитываются только фактические данные,
которые 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_ps
mysqlnd
по протоколу подготовленного запроса.
Это размер фактических данных, которые содержатся в наборах результатов, которые
не исходят из подготовленных запросов и которые получил PHP-клиент.
Модуль не увеличит значение, если PHP-клиент впоследствии не прочитает набор результатов.
Обратите внимание, что, хотя полный результирующий набор мог быть получен от MySQL-сервера
через драйвер mysqlnd
, в этой статистике учитываются только фактические данные,
которые PHP-клиент получил от драйвера mysqlnd
.
Смотрите также описание метрики bytes_received_real_data_normal
.
result_set_queries
SELECT
, SHOW
.
Модуль не увеличивает значение метрики, если произойдет ошибка при чтении
пакета заголовка результирующего набора из строки.
Замечание: Этой статистикой пользуются как косвенным показателем количества запросов, которые PHP отправил на MySQL-сервер. Это помогает определить клиента, который вызывает высокую нагрузку на базу данных.
non_result_set_queries
INSERT
, 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_queries
long_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_sets
flushed_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_executed
ps_prepared_once_executed
rows_fetched_from_server_normal
rows_fetched_from_server_ps
packets_received_rset_row
.
rows_buffered_from_client_normal
Примеры запросов, которые буферизуют результаты:
rows_buffered_from_server_ps
rows_buffered_from_client_normal
,
но для подготовленных запросов.
rows_fetched_from_client_normal_buffered
rows_fetched_from_client_ps_buffered
rows_fetched_from_client_normal_unbuffered
rows_fetched_from_client_ps_unbuffered
rows_fetched_from_client_ps_cursor
rows_skipped_normal
rows_skipped_ps
copy_on_write_saved
copy_on_write_performed
explicit_free_result
implicit_free_result
proto_text_fetched_null
MYSQL_TYPE_NULL
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_null
MYSQL_TYPE_NULL
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_bit
MYSQL_TYPE_BIT
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_bit
MYSQL_TYPE_BIT
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_tinyint
MYSQL_TYPE_TINY
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_tinyint
MYSQL_TYPE_TINY
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_short
MYSQL_TYPE_SHORT
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_short
MYSQL_TYPE_SHORT
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_int24
MYSQL_TYPE_INT24
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_int24
MYSQL_TYPE_INT24
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_int
MYSQL_TYPE_LONG
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_int
MYSQL_TYPE_LONG
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_bigint
MYSQL_TYPE_LONGLONG
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_bigint
MYSQL_TYPE_LONGLONG
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_decimal
MYSQL_TYPE_DECIMAL
или MYSQL_TYPE_NEWDECIMAL
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_decimal
MYSQL_TYPE_DECIMAL
или MYSQL_TYPE_NEWDECIMAL
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_float
MYSQL_TYPE_FLOAT
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_float
MYSQL_TYPE_FLOAT
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_double
MYSQL_TYPE_DOUBLE
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_double
MYSQL_TYPE_DOUBLE
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_date
MYSQL_TYPE_DATE
или MYSQL_TYPE_NEWDATE
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_date
MYSQL_TYPE_DATE
или MYSQL_TYPE_NEWDATE
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_year
MYSQL_TYPE_YEAR
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_year
MYSQL_TYPE_YEAR
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_time
MYSQL_TYPE_TIME
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_time
MYSQL_TYPE_TIME
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_datetime
MYSQL_TYPE_DATETIME
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_datetime
MYSQL_TYPE_DATETIME
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
или MYSQL_TYPE_VARCHAR
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
или MYSQL_TYPE_VARCHAR
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_blob
MYSQL_TYPE_TINY_BLOB
,
MYSQL_TYPE_MEDIUM_BLOB
,
MYSQL_TYPE_LONG_BLOB
или MYSQL_TYPE_BLOB
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_blob
MYSQL_TYPE_TINY_BLOB
,
MYSQL_TYPE_MEDIUM_BLOB
,
MYSQL_TYPE_LONG_BLOB
или MYSQL_TYPE_BLOB
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_enum
MYSQL_TYPE_ENUM
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_enum
MYSQL_TYPE_ENUM
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_set
MYSQL_TYPE_SET
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_set
MYSQL_TYPE_SET
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_geometry
MYSQL_TYPE_GEOMETRY
,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
proto_binary_fetched_geometry
MYSQL_TYPE_GEOMETRY
,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
proto_text_fetched_other
MYSQL_TYPE_*
,
не перечисленных ранее,
которые модуль извлёк из обычного запроса (текстовый протокол MySQL-сервера).
Замечание: Теоретически значение всегда должно равняться
0
.
proto_binary_fetched_other
MYSQL_TYPE_*
,
не включённых ранее,
которые модуль получил из подготовленного запроса (двоичный протокол MySQL-сервера).
Замечание: Теоретически, значение всегда должно равняться
0
.
connect_success
Замечание:
connect_success
содержит сумму успешных постоянных и непостоянных попыток подключения. Следовательно, количество успешных попыток непостоянного подключения равно разностиconnect_success - pconnect_success
.
pconnect_success
connect_failure
reconnect
active_connections
Замечание: Общее количество активных непостоянных соединений равно разности
active_connections - active_persistent_connections
.
active_persistent_connections
explicit_close
Пример #1 Примеры фрагментов кода, которые вызывают явное закрытие
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_close
Пример #2 Примеры фрагментов кода, которые вызывают неявное закрытие
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_close
mysql_real_connect
при попытке
установить соединение.
in_middle_of_command_close
Если не выполняются асинхронные запросы, это должно произойти, только если PHP-приложение неожиданно завершилось, и PHP автоматически закрывает соединение.
init_command_executed_count
mysqli_options(MYSQLI_INIT_COMMAND , $value)
.
Количество успешных запусков — разность
init_command_executed_count - init_command_failed_count
.
init_command_failed_count
Статистика команд 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_*
на 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_close
implicit_stmt_close
Замечание: Подготовленный запрос всегда явно закрыт. Единственный раз, когда он закрывается неявно, — когда подготовка не удалась.
mem_emalloc_count
mem_emalloc_ammount
mem_ecalloc_count
mem_ecalloc_ammount
mem_realloc_count
mem_realloc_ammount
mem_efree_count
mem_malloc_count
mem_malloc_ammount
mem_calloc_count
mem_calloc_ammount
mem_ealloc_count
mem_ealloc_ammount
mem_free_count
command_buffer_too_small
COM_QUERY
(обычный запрос) не помещается в буфер.
Каждый раз при расширении буфера для одного соединения
метрика command_buffer_too_small
увеличивается на единицу.
Если драйверу MySQLnd приходится увеличивать размер буфера сверх первоначального размера,
который задали в байтах в опции mysqlnd.net_cmd_buffer_size,
почти для каждого соединения,
размер по умолчанию для буфера увеличивают, чтобы избежать перераспределения памяти.
connection_reused