Du hast deinen AdBlocker an?

Es wäre ein Traum, wenn du ihn für t3n.de deaktivierst. Wir zeigen dir gerne, wie das geht. Und natürlich erklären wir dir auch, warum uns das so wichtig ist. Digitales High-five, deine t3n-Redaktion

Entwicklung & Design

Die häufigsten MySQL-Fehler von PHP-Entwicklern

Die Welt der Datenbankentwickler ist geheimnisvoll, kryptisch und von großer Expertise geprägt. Echte Datenbankdesigner umgibt der Nimbus des Unerklärlichen. Auf der anderen Seite stehen die herkömmlichen PHP-Entwickler, die zumeist für ihre Applikationen ebenfalls eine Datenbank einsetzen müssen und aus alter Verbundenheit MySQL wählen. Dabei gehen sie in der Regel so pragmatisch wie möglich vor. Unnötiger Know-How-Overhead wird beiseite gelassen. Ein paar Dinge gilt es aber doch zu beachten.

Fehler #1: Alternativen zu MySQL werden nicht betrachtet

Der häufigste MySQL-Fehler, den PHP-Entwickler heutzutage machen, ist, dass sie relativ unreflektiert überhaupt MySQL verwenden. Dabei gibt es je nach Anwendungszweck besser geeignete, dabei auch freie Alternativen.

Man kann es sich heute kaum vorstellen, aber MySQL war zunächst die Basis für Twitter. Auch andere große Projekte nutzten und nutzen noch heute MySQL, allen voran Facebook und WordPress.com. Dabei sind Alternativen verfügbar, die gerade bei Projekten wie WordPress.com, große Vorteile versprechen.

Beispielhaft sei hier die NoSQL-Datenbank Apache Cassandra genannt. Cassandra wurde ursprünglich von Facebook entwickelt. Mittlerweile nutzen es auch Twitter und Digg, um nur große Verwender zu nennen. Basierend auf technischen Ansätzen von Google und Amazon speichert Cassandra Daten so, wie sie später auch abgerufen werden, also vorsortiert. Man kann sich vorstellen, dass eine vorsortierte Tabelle performanter ist, als eine, die zunächst zur Laufzeit mit Sort By in Form gebracht werden muss. Dies gilt umso mehr, je größer der zu sortierende Datenbestand ist.

Cassandra macht nur Sinn, wenn es direkt zu Beginn in die Anwendungsentwicklung integriert wird, da die Daten von der Anwendung via API manipuliert werden. Verwaltungsoberflächen, wie etwa bei MySQL stehen nicht zur Verfügung. Ein weiterer Vorteil von Cassandra ist die einfache Skalierbarkeit. Mehr Rechenpower erforderlich? Einfach einen weiteren Rechner anschließen, alles weitere regelt Cassandra selber. Der größte bekannte Cluster (Zusammenschluss mehrerer Rechner zu einer Datenbank) wird nach wie vor von facebook betrieben und umfasst über 150 Rechner.

Wer sich näher mit Cassandra befassen will, sollte meinen Beitrag „Was kann die NoSQL-Datenbank?“lesen, den ich vor einigen Wochen für das Dr. Web Magazin schrieb. Darin kommen auch noch einige andere Lösungsansätze zum Zuge.

Eine weitere Leseempfehlung ist der Artikel „NoSQL – Neues Denken in der Datenbankwelt“ aus t3n Magazin Nr. 19.

Fehler #2: Select-Abfragen werden stets mit * durchgeführt

Verfechter dieser Vorgehensweise behaupten gern, das Setzen des Platzhalters sei im Grunde der effizienteste Weg der Datenbankabfrage, weil man im Verlaufe der Anwendung ohnehin alle Felder irgendwo braucht. Zudem sei es auf diese Weise einfach möglich, nachträgliche neue Felder ohne Reprogrammierung in der Anwendung zu benutzen.

Beide Aussagen sind falsch. Im ersten Fall kommt es zur Verschwendung von Arbeitsspeicher mit den daraus resultierenden Performanceverlusten. Von Effizienz keine Spur. Und die einfache Hinzunahme neuer Felder im Nachhinein funktioniert nur, wenn die MySQL-Instanz ohne Query-Cache betrieben wird. Ist der Query-Cache aktiviert, was gute Entwickler voraussichtlich tun, würde ein nachträglich hinzugefügtes Feld nicht einmal im Query-Ergebnis auftauchen, solange der MySQL-Server nicht neu gestartet wurde. Dabei sind regelmäßige Neustarts eher nicht die Regel.

SQL-Entwickler Joe Lango vertritt ebenfalls eine klare Meinung dazu.

Foto: © virtua73 - Fotolia.com

Fehler #3: Bei der Datenbankdefinition wird latin als Charset gewählt

Ich bin nicht sicher, wie es heute am Tag ist, aber noch vor einiger Zeit wurde mir bei der Anlage einer MySQl_DB stets einer der latin-Zeichensätze angeboten. Hätte ich nicht aufgepasst und von Hand UTF-8 gewählt, was mir tatsächlich gelegentlich passiert ist, hätte ich mich später über ulkige Effekte, vor allem im Bereich der Sonderzeichen gewundert.

Unbedingt auf den Einsatz von UTF-8 muss geachtet werden, wenn eine Anwendung entwickelt wird, die über mehrere Kontinente funktionieren soll.

Aber: Wenn sichergestellt werden kann, dass die DB nur innerhalb eines Sprachraums verwendet wird und das Auftreten mehrerer Sprachen in den Datenspalten ausgeschlossen ist, sollte die passende ISO-Kodierung gewählt werden. UTF-8 benötigt für die Kodierung die bis zu dreifache Menge an Zeichen, was ein potenzielles Performanceproblem birgt.

Fehler #4: Bei der Wahl der Datentypen wird wenig wählerisch vorgegangen

Natürlich kann man ein Datum grundsätzlich in einem als String deklarierten Feld speichern. Nur macht das keinen Sinn. Probleme gibt es spätestens dann, wenn man mit dem Inhalt datumsbasiert weiter arbeiten will.

Deshalb: Immer den richtigen Datentyp verwenden. Bei Jan Schmager gibt es eine schöne Übersicht dazu.

Fehler #5: Backups der Datenbank werden nicht gemacht

Gut, ich räume ein, es handelt sich um ein ganz generelles Problem. Backups sind grundsätzlich Mangelware. Bei Datenbanken im Livebetrieb ist das allerdings besonders problematisch. Neben Bequemlichkeit als Grund für nicht gefahrene Backups kommt im Falle von MySQL hinzu, dass sehr große Datenbanken je nach Art des Zugriffs darauf, nicht unbedingt leicht zu sichern sind (Stichwort: Scriptlimits).

In diesem Dr. Web Beitrag habe ich massenhaft MySQL-Verwaltungstools vorgestellt, unter anderem auch die kostenlose Backuplösung MySQLDumper, die Schluss macht mit Scriptlimits.

Fehler #6: Uralte PHP MySQL-Funktionen werden genutzt

PHP war von Beginn an auf die Manipulation von MySQL-Datenbanken ausgelegt und brachte entsprechend früh die erforderlichen Funktionen mit. Mittlerweile gibt es Alternativen, die den Erfordernissen moderner Datenbank-Anbindung eher genügen. In vorderster Front stehen dabei die PHP-Extension mysqli (MySQL Improved), sowie die PHP Data Objects. Wer mit dem Zend Framework arbeitet, sollte dessen Data Abstraction Layer verwenden.

Fehler #7: Datenbankusern werden zu viele Rechte eingeräumt

Ich schätze, dass es eher Unkenntnis denn Bequemlichkeit ist. Jedoch habe ich schon sehr oft Datenbanken vorgesetzt bekommen, die aus der Anwendung heraus als Admin, respektive mit uneingeschränkten Rechten auf die DB zugreifen, obschon reine Lesezugriffe an den meisten Stellen ausreichend gewesen wären.

An dieser Stelle muss auch das Maskieren von Querystrings zur Vermeidung von SQL-Injections genannt werden. Eine Vorgehensweise, die ich selbst bei größeren Projekten eher selten zu Gesicht bekomme. Die Wikipedia stellt in ihrem Beitrag zu SQL-Injection unter dem Punkt PHP entsprechende Strategien vor.

Fehler #8: Die falsche Engine wird eingesetzt

Achtung! Dieser „Fehler“ kann Glaubenskriege los treten. Unter MySQL trifft man am häufigsten auf die Datenbankengines MyISAM und InnoDB, wobei MyISAM der Standard ist.

Welche Engine sollte man einsetzen?

MyISAM, also die Engine, die man wählt, wenn man nichts wählt, bietet Tabellen, die einfach aufzusetzen und schnell sind. Aber die wirkliche Besonderheit ist ihre Fähigkeit der Volltextsuche. Dafür unterstützt sie keine Transaktionen, sperrt bei Schreiboperationen immer die gesamte Tabelle und kann nach einem Serverausfall reparaturbedürftig werden.

InnoDB hat die genannten Nachteile nicht. Insbesondere unterstützt sie Transaktionen, sperrt bei Schreiboperationen nur die betroffene Zeile der Tabelle und ist auch bei etwaigen Serverausfällen fehlerresistenter. Dafür, und das wird bei vielen Anwendungen, wie etwa Blogs und Foren das Killerargument sein, ist sie nicht in der Lage, Volltextsuchen durch zu führen.

So kann die Faustregel lauten: Site mit viel usergenerated Content = MyISAM, Site mit Shopfunktionalität oder in anderer Weise finanzrelated = InnoDB

Habt Ihr weitere gängige Fehler oder Besonderheiten auf Lager? Wie geht Ihr bei der DB-Auswahl vor? MySQL stets und ständig oder gern auch mal was besser passendes?

Finde einen Job, den du liebst

Bitte beachte unsere Community-Richtlinien

5 Reaktionen
loki

Hei, Lob und Danke an den Autor! Auch wenn ich mir beim lesen nur dachte.. Jup da hab ich alles richtig gemacht ..ist es doch ein guter Artikel.

Gruß, Loki

Antworten
Andy

@Martin
Da ist wohl jemand TYPO3 geschädigt :-)
Dem kann ich nur zustimmen!

Antworten
Dieter Petereit

@Ein leser: Was ist jetzt absolut falsch? Um es nochmal dezidierter zu sagen:

Ein Zeichensatz ist eine Menge mit Symbolen und Kodierungen. Eine Sortierfolge ist ein Regelsatz für den Vergleich von Zeichen in einem Zeichensatz. Das bedeutet nicht, dass eine Sortierfolge Daten sortiert, wie etwa Sort By.

Der MySQL Server kann viele Zeichensätze unterstützen. Standardeinstellungen für Zeichensätze und Sortierfolgen gibt es auf vier Ebenen, nämlich der Server-, der Datenbank-, der Tabellen- und der Spaltenebene. Jede Datenbank hat einen datenbankspezifischen Zeichensatz (Charset) und eine Datenbanksortierfolge (Collation).

Weiter: Jede Tabelle hat einen tabellenspezifischen Zeichensatz und eine Tabellensortierfolge.

Und noch tiefer: Jede „Zeichenspalte“ (d. h. eine Spalte des Typs CHAR, VARCHAR oder TEXT) hat einen Spaltenzeichensatz und eine Spaltensortierfolge.

Auf allen Ebenen können Zeichensatz und Collation abweichend voneinander definiert werden. In der Regel wird das nicht sinnvoll sein. In Vereinfachung habe ich im Titel von "latin als Charset" gesprochen. Damit war die Kombination aus Charset latin 1 und beispielsweise Collation latin1_german2_ci gemeint.

Von absolut falsch kann demnach keine Rede sein. Höchstens kann man sich streiten, ob ich zu stark vereinfacht habe, was ich mit diesem Kommentar jedenfalls korrigiert haben dürfte.

Antworten
Ein leser

Fehler #3: Bei der Datenbankdefinition wird latin als Charset gewählt

So leider absolut falsch, die Kollation bestimmt lediglich die Sortierung.

Daten innerhalb einer DB haben kein encoding, jedoch die mysqlverbindung und die ausgegebene seite. 2teres solllte die selben werte tragen wie nr1.

Antworten
Martin Brüggemann

Ich finde der absolute megaschlimmste und gleichzeitig total unterschätzte Fehler, den man schnell macht, ist es zu vergessen einen Index zu setzen und am Schlimmsten: Mehrere Tabellen über Spalten ohne Index joinen!! Das lässt im schlimmsten Fall den kompletten MySQL-Server zusammenbrechen. Der Geschwindigkeitsverlust durch einen nicht oder falsch gesetzten Index ist gigantisch. Das ist ein absolutes NONONONOGO! :)

Antworten

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.