Rychlost SQL dotazu

V případě, že se stránka dotazující se na data do databáse pomalu načítá, je vhodné měřit dobu jednotlivých SQL dotazů a ty nejpomalejší prověřit, zda by nemohly být rychlejší.

Doba provedení v PHP

V PHP vypadá měření doby následovně:

$zacatek = microtime(true); 
// Nějaký kód, který meříme
$konec = microtime(true);
$rozdil = ($konec - $zacatek) * 1000;

V proměnné $rozdil bude čas provedení kódu v milisekundách. Stačí tedy obdobné měření provést při každém SQL dotazu.

Měření SQL dotazů

Jelikož přidávat výše uvedený kód ke každému dotazu by nebylo moc elegantní, nabízí se vytvořit si jednu funkci pro provádění všech SQL příkazů.

Funkce měřicí rychlost SQL dotazů v PDO by mohla vypadat takto:

$seznamDotazu = array();
$celkovaDoba = 0;

function query($dotaz, $data = array()) {
  global $pdo, $seznamDotazu, $celkovaDoba;
  $zacatek = microtime(true); 
  
  try {
    $sql = $pdo->prepare($dotaz);
    $sql->execute($data);
  }
  catch (PDOException $e) {
    die('Error: ' . $e->getMessage() . 
    ' Dotaz: ' . $dotaz . " Data:" . implode("; ", $data));
  }
  
  $konec = microtime(true);
  $rozdil = ($konec - $zacatek) * 1000;
  
  array_push(
    $seznamDotazu, 
    array("sql" => $dotaz, "cas" => $rozdil)
  );
  $celkovaDoba += $rozdil;
  
  return $sql;
}

Nyní se při zavolání funkce query:

  1. do pole $seznamDotazu uloží všechny SQL dotazy a čas jejich provedení,
  2. v proměnné $celkovaDoba potom bude celková doba všech dotazů.

Výpis dotazů

function vypisDotazu() {
  global $seznamDotazu, $celkovaDoba;
  echo "<ol>";
  foreach ($seznamDotazu as $dotaz) {
    echo "<li><b>" . round($dotaz["cas"], 4) . "</b> ms (" . 
          round(($dotaz["cas"] / $celkovaDoba) * 100, 2) . 
          " %)<br>"  . $dotaz["sql"];
  }
  echo "</ol>";
}

Seznam SQL dotazů je vhodné umístit do fixně posicovaného elementu, aby neovlivňoval okolí stránky.

Funkční skripty jsou na GitHubu.

Měření dotazů v JSONu

V případě, že aplikace, kde se má měřit doba, nebo její část, funguje na principu získávání data JavaScriptem ze souboru, který vrací JSON, není možné použít výše uvedený HTML výpis. JSON by potom byl nevalidní.

Nezbývá tedy než i dobu SQL dotazů vracet v JSONu a následně vypsat JavaScriptem. Například si připravit funkci json, která k původnímu poli potřebných dat připojí pole s dobou SQL dotazů:

function json($pole) {
  global $seznamDotazu, $celkovaDoba;
  $pole = array_merge(
    $pole, 
    array(
      "doba" => $celkovaDoba, 
      "sql" => $seznamDotazu
    )
  );
  echo json_encode($pole);
}

AJAXem získaná data z JSONu se potom v JavaScriptu předají mj. funkci, která zajistí výpis doby SQL dotazů.

var vypisDotazu = function(data) {
  var vystup = "<b>Celková doba SQL:</b> " + 
                data.doba + " ms<ol>";
  for (key in data.sql) {
    vystup += "<li><b>" + data.sql[key]["cas"] + 
              "</b> ms (" + 
              (data.sql[key]["cas"] / data.doba) * 100 + 
              " %)<br>" + data.sql[key]["sql"];
  }
  document.getElementById('debugVypis').innerHTML = vystup;
}

To je všechno. Líbil se vám článek a chcete se dozvědět, až vyjde další?

Sledujte:

 

Připomínky mi pište do komentářů ↓

PDO

MySQL přes PDO

PDO je PHP rozhraní pro pohodlnější práci s SQL databásí. Jaké přináší výhody a jak ho používat.

Transakce v MySQL

MySQL a transakce v PDO

K čemu slouží, jak a proč používat transakce při používání MySQL v PDO.

Zamykání tabulek

Zamykání MySQL tabulek

K čemu slouží, kdy a proč používat zamykání tabulek příkazem LOCK TABLE.

Instalace Apache, PHP a MySQL za 30 vteřin

Instalace Apache, PHP a MySQL za 30 vteřin

Jak si ve Windows spustit vlastní Apache, PHP a MySQL na svém PC za půl minuty.

Chyby při programování

Jak zobrazit chybové hlášky

Při odstraňování problému v HTML/CSS/JS/PHP/SQL je nutný přístup k chybovým hláškám, jak se k nim dostat?

Komentáře