6.1 Einführung

Kommen wir nun von der Theorie zur Praxis.

„Theoretisch gibt es keinen Unterschied zwischen Theorie und Praxis. In der Praxis sind sie es.“

Wir leben in der realen Welt und alle Softwareprodukte werden letztendlich für lebende Menschen entwickelt. Und diese lebenden Menschen sind sehr verärgert über langsam ladende Websites und langsamer werdende Programme.

Und wenn eine Datenbankabfrage länger als eine Sekunde dauert, ist das inakzeptabel . Benutzer werden einfach kein Produkt verwenden, dessen Seiten/Funktionen so langsam sind.

Um eine Seite anzuzeigen, müssen Sie jedoch häufig mehrere Dutzend Abfragen an die Datenbank durchführen. Und wenn sie nacheinander ausgeführt werden, dann gibt es kein zweites Limit mehr, sondern sagen wir 100 ms pro Anfrage.

Hier sind die fünf besten Möglichkeiten, wie Programmierer Datenbankabfragen beschleunigen:

  1. Hinzufügen von Indizes zu Tabellen in der Datenbank.
  2. Abfragen umschreiben und optimieren.
  3. Aktivieren (und konfigurieren) Sie das Caching auf der Datenbankseite.
  4. Aktivieren Sie das Caching auf der Clientseite.
  5. Durchführen einer Datenbank-Denormalisierung.

Mit all diesen Dingen sind Sie größtenteils bereits vertraut, daher handelt es sich im Folgenden nur um praktische Ratschläge.

6.2 Indizes

Es ist kein Geheimnis, dass die Arbeit mit einer Datenbank den größten Teil der Arbeit auf fast jeder Website ausmacht. Und die Arbeit mit der Datenbank ist am häufigsten der Flaschenhals von Webanwendungen.

In diesem Artikel möchte ich praktische Ratschläge zur Verwendung von MySQL geben.

Ich sage gleich:

  • Dieser Artikel ist über MySQL geschrieben, obwohl die allgemeinen Dinge wahrscheinlich für jedes DBMS gelten.
  • Alles, was in dem Artikel geschrieben steht, ist meine persönliche Sichtweise und nicht die ultimative Wahrheit.
  • Ratschläge erheben keinen Anspruch auf Neuheit und sind das Ergebnis einer Verallgemeinerung der gelesenen Literatur und persönlicher Erfahrungen.
  • Im Rahmen dieses Artikels werde ich nicht auf MySQL-Konfigurationsprobleme eingehen.

Probleme bei der Verwendung von MySQL lassen sich in die folgenden drei Gruppen einteilen (in der Reihenfolge ihrer Wichtigkeit):

  1. Nichtnutzung oder Missbrauch von Indizes.
  2. Falsche Datenbankstruktur.
  3. Falsche \ suboptimale SQL-Abfragen.

Schauen wir uns jede dieser Gruppen genauer an.

Verwendung von Indizes

Die Nichtverwendung oder der Missbrauch von Indizes führt am häufigsten zu einer Verlangsamung von Abfragen. Für diejenigen, die mit der Funktionsweise von Indizes nicht vertraut sind oder noch nicht im Handbuch darüber gelesen haben, empfehle ich dringend, es zu lesen.

Tipps zur Verwendung von Indizes:

  • Sie müssen nicht alles indizieren . Sehr oft indizieren Menschen einfach alle Felder einer Tabelle, ohne die Bedeutung zu verstehen. Indizes beschleunigen das Abrufen, verlangsamen jedoch das Einfügen und Aktualisieren von Zeilen, sodass die Auswahl jedes Index sinnvoll sein muss.
  • Einer der Hauptparameter, die den Index charakterisieren, ist die Selektivität, also die Anzahl der verschiedenen Elemente im Index. Es macht keinen Sinn, ein Feld zu indizieren, das zwei oder drei mögliche Werte hat. Ein solcher Index wird wenig Nutzen bringen.
  • Die Auswahl der Indizes sollte mit einer Analyse aller Abfragen für eine bestimmte Tabelle beginnen. Sehr oft kann man nach einer solchen Analyse anstelle von drei oder vier Indizes einen einzigen zusammengesetzten Index erstellen.
  • Bei der Verwendung zusammengesetzter Indizes ist die Reihenfolge der Felder im Index von entscheidender Bedeutung.
  • Vergessen Sie nicht, Indizes abzudecken. Wenn alle Daten in einer Abfrage aus einem Index abgerufen werden können, greift MySQL nicht direkt auf die Tabelle zu. Solche Anfragen werden sehr schnell ausgeführt. Beispielsweise SELECT name FROM user WHERE login='test'ist für eine Abfrage mit einem Index (Anmeldename, Name) kein Zugriff auf die Tabelle erforderlich. Manchmal ist es sinnvoll, einem zusammengesetzten Index ein zusätzliches Feld hinzuzufügen, um den Index abzudecken und Abfragen zu beschleunigen.
  • Bei Zeilenindizes reicht es oft aus, nur einen Teil der Zeile zu indizieren. Dadurch kann die Indexgröße erheblich reduziert werden.
  • Wenn %es am Anfang steht, LIKE(SELECT * FROM table WHERE field LIKE '%test')werden keine Indizes verwendet.
  • Der FULLTEXT- Index wird nur mit der MATCH ... AGAINST- Syntax verwendet .

6.3 Datenbankstruktur

Eine gut gestaltete Datenbank ist der Schlüssel für eine schnelle und effiziente Arbeit mit der Datenbank. Andererseits bereitet eine schlecht gestaltete Datenbank Entwicklern immer Kopfzerbrechen.

Tipps zum Datenbankdesign:

  1. Verwenden Sie möglichst kleine Datentypen. Je größer der Datentyp, desto größer die Tabelle, desto mehr Festplattenzugriffe sind erforderlich, um die Daten abzurufen. Verwenden Sie ein sehr praktisches Verfahren: SELECT * FROM table_name PROCEDURE ANALYSE();um die minimal möglichen Datentypen zu ermitteln.
  2. Beachten Sie in der Entwurfsphase Normalformen. Häufig greifen Programmierer bereits in dieser Phase auf die Denormalisierung zurück. Allerdings ist in den meisten Fällen zu Beginn des Projekts alles andere als klar, wie dies zustande kommen kann. Das Denormalisieren einer Tabelle ist viel einfacher, als unter einer nicht optimal denormalisierten Tabelle zu leiden. Und JOINmanchmal funktioniert es schneller als falsch denormalisierte Tabellen.
  3. Verwenden Sie keine NULLSpalten, es sei denn, Sie benötigen sie bewusst.

6.4 SQL-Abfragen.

Ebenso häufig besteht der Wunsch, alle Abfragen in nativem SQL neu zu schreiben, damit die Abfrage möglichst schnell erfolgt. Wenn Sie sich dafür entscheiden, finden Sie hier einige Tipps:

  1. Vermeiden Sie Anfragen in einer Schleife. SQL ist eine Sprache von Mengen, und das Schreiben von Abfragen sollte nicht in der Sprache der Funktionen, sondern in der Sprache der Mengen angegangen werden.
  2. Vermeiden Sie *(Sternchen) in Abfragen. Geben Sie gerne genau die Felder an, die Sie auswählen. Dadurch wird die Menge der abgerufenen und gesendeten Daten reduziert. Vergessen Sie auch nicht, Indizes abzudecken. Selbst wenn Sie alle Felder in der Tabelle auswählen, ist es besser, sie aufzulisten. Erstens verbessert es die Lesbarkeit des Codes. Wenn Sie Sternchen verwenden, ist es unmöglich herauszufinden, welche Felder sich in der Tabelle befinden, ohne sie genauer zu betrachten. Zweitens hat Ihre Tabelle heute fünf INT- Spalten, und einen Monat später wurden noch eine weitere TEXT- und BLOB-Spalte hinzugefügt , und das Sternchen blieb so, wie es war.
  3. Um bei der Paginierung die Gesamtzahl der Datensätze zu erhalten, verwenden Sie SQL_CALC_FOUND_ROWSund . SELECT FOUND_ROWS();Bei Verwendung SQL_CALC_FOUND_ROWS MySQLwird die ausgewählte Anzahl von Zeilen zwischengespeichert (bevor LIMIT angewendet wird) und bei Verwendung SELECT FOUND_ROWS()nur dieser zwischengespeicherte Wert zurückgegeben, ohne dass die Abfrage erneut ausgeführt werden muss.
  4. Vergessen Sie nicht, dass es INSERTeine Syntax für mehrere Einfügungen gibt. Eine Abfrage wird um eine Größenordnung schneller ausgeführt als mehrere Abfragen in einer Schleife.
  5. Verwenden Sie es LIMITdort, wo Sie nicht alle Daten benötigen.
  6. INSERT… ON DUPLICATE KEY UPDATE…Wird anstelle von und INSERToder UPDATEnach der Auswahl und häufig anstelle von verwendet REPLACE.
  7. Vergessen Sie diese erstaunliche Funktion nicht GROUP_CONCAT. Es kann bei komplexen Abfragen hilfreich sein.