Don’t: Produktive Datenbankabfragen mit Select * from …

Mittels Cacti konnten wir einen beachtlichen Anstieg des mySQL Traffics auf einem Shared Hosting Server feststellen – welcher langsam aber sicher die Performance des Servers beeinträchtigte.

Ein einfaches

SHOW FULL PROCESSLIST;

auf der mySQL-Konsole dieses Servers brachte folgendes Query mit sehr kurzen Intervallen und einer grossen Laufzeit zum vorschein:

SELECT * FROM hits ORDER by userid DESC

Somit war auch die verdächtige Datenbank – und dadurch auch der verantwortliche Account erruiert. Ein kurzer Blick auf das Schema dieser Datenbank/Tabelle zeigte folgendes:

  • > 1’000’000 Datensätze!
  • Kein Index auf userid!

Als erstes wurde mal userid indexiert, was zwar die Queryperformance deutlich verbesserte – aber die Last des Servers immernoch überdurchschnittlich beanspruchte.

Ich konnte mir spontan nicht erklären, wesshalb jemand den kompletten Inhalt dieser Tabelle auslesen sollte. Alleine der fehlende Index und das „Select *“ waren für mich ein Indiz, dass hier KEIN Profi am Werk war. Mich packte der Ergeiz und ich warf einen Blick auf den PHP-Code der entsprechenden Applikation. Es handelte sich dabei um ein gut frequentiertes Toplisten-Script. Irgendwo im Code fand ich folgendes:

..
{
  $useridgen=mysql_query("SELECT * FROM hits ORDER BY userid DESC");
  $idgenaray=mysql_fetch_array($useridgen);
  $userid=$idgenaray[userid]+1;
}
..

Toll, diese Funktion macht also nichts anderes als die nächste ID für einen Datenbankeintrag zu ermitteln. 😉
Auto_Increment war hier offenbar ein Fremdwort..

Nach einer Rücksprache mit dem betroffenen Kunden wurde die Applikation so minimal wie möglich angepasst.

{
  $useridgen=mysql_query("SELECT max(userid) as userid FROM hits");
  $idgenaray=mysql_fetch_array($useridgen);
  $userid=$idgenaray[userid]+1;
}

Das neue Query liefert durch den SELECT max() nur noch genau 1 Datensatz zurück (statt > 1’000’000 vorher)! – erfüllt aber genau dieselbe Funktion innerhalb dieses Scriptes. Das Script selbst musste somit nicht weiter angepasst werden.

Die Auswirkung dieses Korrektur lässt sich auf folgenden Graphen auf beeindruckende Art und Weise erkennen:

Schlagworte: , , ,

Kommentieren


Social Widgets powered by AB-WebLog.com.