Как измерить время mysql, время и / или нагрузку SQL-запроса в php?

Мне нужно найти некоторую меру того, как долго мои запросы берутся и загрузка на сервере, если это возможно.

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

Есть идеи?

Синтаксис PHP

$starttime = microtime(); $query = mysql_query("select * from table"); $endtime = microtime(); 

Затем вычислите разницу между $ starttime и $ endtime.

Посмотрите на профилировщик запросов. Это может сделать бит времени запроса того, что вам нужно.

https://www.digitalocean.com/community/tutorials/how-to-use-mysql-query-profiling

https://dev.mysql.com/doc/refman/5.5/en/show-profile.html

Существуют различные инструменты для просмотра нагрузки на сервер

Почти невозможно, если ваша база данных и веб-сервер расположены по-разному
плюс вы пытаетесь добиться этого с помощью PHP

ограничение

  • вам необходимо иметь доступ к обоим серверам (например, ssh)
  • если вы вставляете проверку загрузки ЦП, такую ​​как sys-файл exec_shell в базу данных и возвращаете uptime при каждом выполнении запроса, является излишним

обходной путь

встроить cronjob в ваш сервер базы данных,
периодически отправляется по электронной почте, если загрузка сервера повышается

Или

в базе данных,
периодически отправлять электронную почту по текущему запущенному запросу, используя
show full processlist

Пример для хранения ПОКАЗАТЬ ПОЛНЫЙ ПРОЦЕССИСТОР

 $con = mysqli_connect(...) or die('unable to connect'); $sql = "show full processlist"; $res = mysqli_query($con, $sql) or die($sql); /* optional path is /tmp */ $fp = fopen('/tmp/'.date('YmdHis'), 'w+'); while ($row = $res->fetch_row()) { fputcsv($fp, $row); } $res->free_result(); 

Вышеприведенное должно быть достаточным для того, чтобы сбрасывать текущий список процессов mysql в файл.
В linux box имеется множество команд, позволяющих пользователю показывать загрузку процессора.
Но это окна, я думаю, вы можете найти с помощью некоторого поиска в google SO

Существует довольно много информации, которую вы можете получить о работе базы данных

 SHOW STATUS; 

запрос.

Я бы предположил, что переменная Last_query_cost может быть весьма полезна для ваших целей измерений. Также как Slow_queries, который покажет количество запросов, которые выполнялись дольше, чем определенное количество времени. Полный список этих переменных находится здесь http://dev.mysql.com/doc/refman/5.1/en/server-status-variables.html Существует также функция php mysql_stat () php, которая возвращает некоторые данные об использовании базы данных , Например, запросы в секунду могут быть несколько полезными. Но для получения более определенных данных потребуется ssh-доступ к базе данных.

используйте microtime для измерения времени, необходимого для запроса.

Для загрузки сервера см. http://www.php.net/manual/en/function.sys-getloadavg.php . Использование ЦП в основном не имеет значения, поскольку mysql будет привязан к диску большую часть времени.

Для более подробной статистики вам следует использовать mysqli :: get_connection_stats (если вы используете php 5.3+)

http://www.php.net/manual/en/mysqli.get-connection-stats.php

PHP действительно может только время выполнения mysql_query() , которое включает в себя все время туда и обратно, время ожидания и время передачи. Чтобы разбить, вам нужно будет использовать профилировщик MySQL, как уже упоминалось. Следующий код должен выводить информацию, которую вам нужно знать. Если вы хотите включить профилирование в свой PHP-процесс, вам нужно будет использовать профилировщик и выбрать соответствующие поля из таблицы information_schema.profiling , но если нужно просто проверить производительность, приведенное ниже должно быть достаточно.

 <?php $con = mysql_connect("localhost","root","my-password"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my-database", $con); function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } mysql_query("set profiling=1;"); $starttime = microtime_float(); $query = mysql_query("SELECT * FROM my-table"); $endtime = microtime_float(); $trans_result = mysql_query("select sum(duration) as transtime from information_schema.profiling where query_id=1"); $transtime = mysql_result($trans_result, 0, 'transtime'); $total_time = ($endtime - $starttime); $transtime = ($total_time - $transtime); echo 'Total time: '.$total_time.' secs<br />'; echo 'Transfer time: '.$transtime.' secs<br />'; echo 'Query time break-down;<br />'; $debug_result = mysql_query("show profile cpu for query 1;"); while ($row = mysql_fetch_assoc($debug_result)) { echo $row['Status'].' (Time: '.$row['Duration'].', CPU_User: '.$row['CPU_user'].', CPY_sys: '.$row['CPU_system'].')<br />'; } ?> 

Когда вы довольны производительностью, удалите все, кроме запроса MySQL, который вы хотите.