5 Tipps zur Entlastung Ihrer MySQL-Datenbank

Erst kürzlich hatte ich das zweifelhafte Vergnügen ein easyLink V3 Plugin zu erweitern, dass ursprünglich von einem externen Programmierer entwickelt wurde. Leider fällt bei solchen Arbeiten auch immer wieder auf, dass viele SQL-Statements nicht wirklich optimiert wurden und somit die Datenbank nur unnötig belastet wird. Damit euch solche Fehler nicht mehr unterlaufen, habe ich hier einmal 5 wichtige Tipps zusammengestellt.

1. Vermeidet den Aufruf von SELECT *

Die Anwendung des Wildcard-Parameter (*) im SELECT-Statement ist zwar immer äußerst verlockend, doch benötigt die Ausführung der Query wesentlich weniger Zeit, wenn Sie Ihr lediglich die benötigten Felder abfragt.

// Nicht zu empfehlen
$result = mysql_query("SELECT * FROM user WHERE userID = 1");
$user = mysql_fetch_assoc($result);
var_dump($user['username']);

// Besser ist es so
$result = mysql_query("SELECT username FROM user WHERE userID = 1");
$user = mysql_fetch_assoc($result);
var_dump($user['username']);

2. Vermeidet ORDER BY RAND()

Gerade Anfänger erfreuen sich immer wieder daran, wenn Sie einen Eintrag „per Zufall“ aus der Datenbank auswählen und nicht selten wird dabei auf das Konstrukt ORDER BY RAND() zurückgegriffen. Eigentlich liegt es ja auch sehr nahe, doch nur wenige Anwender wissen, dass die Datenbank diese Funktion zunächst auf jede in der Tabelle befindliche Zeile anwendet und genau das benötigt natürlich sehr viel Rechenleistung.

// Nicht zu empfehlen
$result = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1");

// Besser ist es so
$row = mysql_query("SELECT COUNT(*) FROM user");
$row = mysql_fetch_assoc($row);
$rand = mt_rand(0,$d[0] - 1);

$result = mysql_query("SELECT username FROM user LIMIT $rand,1");

3. Benutzt LIMIT 1 wenn Ihr nur 1 Zeile benötigt

So gut wie in jeder Anwendung kommt es vor, dass Ihr einen spezifischen Eintrag aus der Tabelle auslesen müsst. Dabei kann es sich z.B. um einen Benutzeraccount oder vielleicht um einen Eintrag in einem Forum handeln. Immer wenn Ihr einen solchen Fall habt, dann achtet stets darauf am Ende der SQL-Query ein LIMIT 1 anzufügen, denn das sorgt letztendlich dafür, dass die Verarbeitung beim SQL-Server sofort nach der Auffinden des ersten zutreffenden Datensatzes unterbrochen wird.

// Nicht zu empfehlen
$result = mysql_query("SELECT userID, username FROM user WHERE stadt = 'Hamburg'");

// Besser ist es so
$result = mysql_query("SELECT userID, username FROM user WHERE stadt = 'Hamburg' LIMIT 1");

4. Optimiert eure Queries für den Cache

Die meisten SQL-Server arbeiten heute mit einem internen Cache. Über diesen Cache werden die Ergebnisse von wiederkehrenden Queries zwischengespeichert und somit natürlich auch schneller zurückgegeben.

Nun gibt es jedoch bestimmte Funktionen wie z.B. CURDATE(), NOW(), RAND() etc., bei denen erwartet der Server grundsätzlich ein neues Ergebnis und somit sind Queries, die diese Funktionen beinhalten vom Caching ausgeschlossen. Ihr solltet daher versuchen, bei einfachen Queries die entsprechenden Felder mit Hilfe von PHP Funktionen zu belegen, denn somit umgeht Ihr geschickt die interne Cache-Sperre des Servers.

// Nicht zu empfehlen
$result = mysql_query("SELECT username FROM user WHERE signup >= CURDATE()");

// Besser ist es so
$today = date("Y-m-d");
$result = mysql_query("SELECT username FROM user WHERE signup >= '$today'");

5. Verwendet ENUM vor VARCHAR

Auch der richtige Spaltentyp ist für eine performante Datenbank-Applikation von großer Bedeutung, denn gerade hier läßt sich einiges an Geschwindigkeit aus dem System herausholen. Nehmen wir mal an, Ihr habt in eurer Tabelle eine Spalte status und darin können sich die Werte wie „active“, „inactive“, „pending“ etc. befinden.

Die meisten von euch würden hier jetzt vermutlich den Wert VARCHAR(50) oder größer als Spaltentyp definieren, doch dabei eignet sich für solche Anwendungsgebiete ENUM wesentlich besser. Intern behandelt der SQL-Server ein Feld vom Typ ENUM nämlich wie ein Feld vom Typ TINYINT und damit belegt es nicht nur weniger Speicher, sondern es wird auch wesentlich schneller durchsucht.

1 comment for “5 Tipps zur Entlastung Ihrer MySQL-Datenbank

  1. 20. Februar 2011 at 20:48

    Danke für die Tipps habe teilweise auch Performance-Probleme bei meiner MySQl-Datenbank, ich hoffe es hilft.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.