flashnfantasy: Datenbankoptimierung

Beitrag lesen

Früher oder später werdet ihr eventuell folgende PHP-Routine schätzen lernen...
Der mySQL-Befehl EXPLAIN zeigt an, wie eine Datenbank-Abfrage umgesetzt wird - vorallem bei welchen Tabellen eine Anfrage sehr lange dauert und wo der Einsatz von Indezes eine Steigerung bringt.
Die PHP-Routine stellt das Ganze etwas übersichtlicher dar.

Zur Funktion:
analyseQuery (
Datenbank,
SQL-Abfrage zB "SELECT id FROM table1 AS a1...",
mode = 1 wenn die Anzahl der zutreffenden Zeilen ermittelt werden soll, daß entspricht dann einer realen Abfrage und kann einiges dauern...
)

Optimieren von Datenbanken geht nicht, ohne daß man sich Gedanken gemacht hat über INDEZES, letztlich habe ich manchmal Datenbank-Abfragen gemacht, die tausendmal schneller liefen, wenn ich vorher einen Index 'created' und ihn danach wieder 'gedropped' habe.

function analyseQuery ($db, $query, $mode = 0)
{
  $ergq = mysql_query("EXPLAIN $query",$db);
  print "<table border="1" cellspacing="0">";
    print "<tr>";
    print "<td colspan="8" class="tinytable">".htmlentities($query)."</td>";
    print "</tr>";
    print "<tr>";
    print "<td class="tinytable">table</td>";
    print "<td class="tinytable">type</td>";
    print "<td class="tinytable">possible_keys</td>";
    print "<td class="tinytable">key</td>";
    print "<td class="tinytable">key_len</td>";
    print "<td class="tinytable">ref</td>";
    print "<td class="tinytable">rows</td>";
    print "<td class="tinytable">Extra</td>";
    print "</tr>";
  $rowsprod = 1;
  while ($dsatz = mysql_fetch_array($ergq))
  {
    $rows = $dsatz["rows"];
    $rowsprod *= $rows;
    print "<tr>";
    print "<td class="tinytable">".$dsatz["table"]."</td>";
    print "<td class="tinytable">".$dsatz["type"]."</td>";
    print "<td class="tinytable">".$dsatz["possible_keys"]."</td>";
    print "<td class="tinytable">".$dsatz["key"]."</td>";
    print "<td class="tinytable">".$dsatz["key_len"]."</td>";
    print "<td class="tinytable">".$dsatz["ref"]."</td>";
    print "<td class="tinytable">$rows</td>";
    print "<td class="tinytable">".$dsatz["Extra"]."</td>";
    print "</tr>";
  }
    print "<tr>";
    print "<td colspan="8" class="tinytable">Anzahl Abfragen = $rowsprod</td>";
    print "</tr>";
  if ($mode == 1)
  {
    $ergqr = mysql_query("$query", $db);
    $c = mysql_num_rows($ergqr);
    print "<tr>";
    print "<td colspan="8" class="tinytable">Anzahl Treffer = $c</td>";
    print "</tr>";
  }
  print "</table>";
}