Статистика

Використання статистичних даних

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 INFILEINSERTUPDATESELECT, повідомлення про помилку).Використовується для налагодження реалізації клієнт-серверного протоколу. Зверніть увагу, що загальний розмір включає заголовний пакет, розміром 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_executedps_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();

bytes_received_real_data_ps | Поєднання | Кількість байт корисного навантаження, витягнутого клієнтом PHP з mysqlnd використовуючи підготовлені запити. | Це розмір лише тих даних, які витягнули клієнт PHP. Значення метрики не збільшуватиметься якщо клієнт PHP не буде запитувати ці дані. Зверніть увагу, що хоч можливо mysqlnd забрав і повний результуючий набір з сервера MySQL, але в цій метриці враховуються лише дані, вже отримані клієнтом PHP від mysqlndТакже смотритеbytes_received_real_data_normal.

Результуючий набір

Статистика mysqlnd: результуючий набір

МетрикаОбласть примененияОписЗамечания
result_set_queriesЗ'єднанняКількість запитів, за якими було створено результуючий набір. Приклад запитів, що створюють результуючий набір: SELECTSHOW. . Статистика не збільшуватиметься у разі виникнення помилки читання заголовного пакета результуючого набору.Ви можете використовувати цю метрику як опосередкований лічильник виконаних запитів, наприклад, для виявлення клієнта, що створює велике навантаження на БД.
non_result_set_queriesЗ'єднанняКількість запитів, за якими не створено результуючий набір. Приклад запитів, що не створюють результуючого набору: INSERTUPDATELOAD 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 unbuffered result set created by "normal" query or 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_successconnect_failureЗ'єднанняЗагальна кількість вдалих/невдалих спроб з'єднання.Перевикористані та інші типи з'єднань включаються.
reconnectПроцесЗагальна кількість спроб виконати real_connect на вже відкритому з'єднанні.Наступний код $link = new mysqli(...); $link->real_connect(...) призведе до переєднання. Але $link = new mysqli(...); $link->connect(...) не приведе, оскільки $link->connect(...) примусово закриє існуюче з'єднання перед створенням нового.
pconnect_successЗ'єднанняЗагальна кількість успішних спроб відкрити постійне з'єднанняОбратите внимание, чтоconnect_success містить сумарну кількість звичайних та постійних з'єднань. Отже кількість звичайних сполук можна обчислити так: connect_successpconnect_success
active_connectionsЗ'єднанняЗагальна кількість активних сполук, як звичайних, і постійних.
active_persistent_connectionsЗ'єднанняЗагальна кількість активних постійних з'єднань.Загальна кількість активних непостійних з'єднань дорівнює: active_connectionsactive_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_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_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_closeimplicit_stmt_closeПроцесЗагальна кількість закритих запитів.Закриття завжди відбувається явно, крім помилок під час підготовки.
mem_emalloc_countmem_emalloc_ammountmem_ecalloc_countmem_ecalloc_ammountmem_erealloc_countmem_erealloc_ammountmem_efree_countmem_malloc_countmem_malloc_ammountmem_calloc_countmem_calloc_ammountmem_realloc_countmem_realloc_ammountmem_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) практично для кожного з'єднання вам варто задуматися про зміну цього значення.

Розмір за замовчуванням буфера становить 4096 байт, що є найменшим можливим значенням. Це значення можна змінити в php.ini, змінивши значення ключа mysqlnd.net_cmd_buffer_sizeили используяmysqli_options(MYSQLI_OPT_NET_CMD_BUFFER_SIZE, int size)

connection_reused