Schlechte Datenbankleistung ist jedem DBA ein Dorn im Auge. Und es ist nicht immer einfach, die eigentliche Ursache von Leistungsproblemen zu isolieren, was den Stress nur noch erhöht.
Das Optimieren Ihrer SQL Server-Datenbanken ist eine großartige Möglichkeit, einige Ihrer Leistungsprobleme zu lösen, aber es ist möglicherweise nicht immer offensichtlich, wo Sie mit dem Optimierungsprozess beginnen sollten. Wenn Sie Speicherplatz, Arbeitsspeicher und andere Netzwerk- und Hardware-Leistungskiller ausschließen und Ihre SQL Server-Leistung immer noch hinterherhinkt, ist es an der Zeit, sich mit Ihren Abfragen zu befassen.
Nicht optimierte Abfragen können unzählige Leistungsprobleme für Ihre Systeme verursachen. Positiv zu vermerken ist, dass ein paar häufige Abfragefehler für den größten Teil der Verschlechterung der Datenbankleistung verantwortlich sind.
Wenn Ihre Abfragen unter einem dieser sechs Probleme leiden, machen Sie sich bereit für eine ernsthafte Leistungsoptimierung.
Problemfrage Nr. 1:Gleiche Ausdrücke mit führenden Wildcards
Führende Platzhalter hindern MySQL daran, Indizes zu verwenden, und erzwingen einen vollständigen Tabellenscan, selbst wenn Sie ein Feld innerhalb der Tabelle indiziert haben. Das Scannen aller Zeilen in einer Tabelle verlangsamt die Bereitstellung Ihrer Abfrageergebnisse erheblich. Entfernen Sie daher den führenden Platzhalter, um die Effizienz zu verbessern.
Problemfrage Nr. 2:Nicht indizierte Spalten, die in „Where“- und „Group By“-Klauseln verwendet werden
Das Indizieren von Spalten trägt dazu bei, Abfrageergebnisse schneller zurückzugeben, da vollständige Tabellenscans überflüssig werden. Die Indizierung hilft auch beim Sortieren von Datensätzen, wenn sie zurückgegeben werden, und garantiert, dass diese Datensätze eindeutig identifizierbar sind, was besonders in Tabellen mit mehr als 10 Zeilen nützlich ist.
Für ein wenig Perspektive sollten Sie in Betracht ziehen, in Ihrer Abfrageanalyse vor und nach der Indizierung eine „Explain“-Anweisung auszuführen. Dies gibt Ihnen eine Vorstellung davon, wie viele Scanreihen Sie gerade eingespart haben.
Problemfrage Nr. 3:Wie-Anweisungen, die den „oder“-Operator anstelle einer Union-Klausel verwenden
Das Ausführen von Abfragen mit dem Vergleichsoperator „or“ für Felder oder Spalten in einer Tabelle kann nützlich sein, aber die zu häufige Anwendung von „or“ in einer „where“-Klausel ist ein weiterer schneller Weg zu einem vollständigen Tabellenscan.
Eine Union-Klausel kann die Ausführung der SQL-Abfrage beschleunigen, insbesondere wenn verschiedene Indizes jede Seite der Abfrage optimieren. Im Wesentlichen nimmt der Union-Operator die Ergebnisse zweier schneller, indizierter Abfragen und führt sie zu einer zusammen.
Problemfrage Nr. 4:Wildcard-Suchen
Wenn Sie in einer Situation feststecken, in der Sie mit Platzhaltern suchen müssen, aber die Leistungseinbußen nicht hinnehmen möchten, versuchen Sie es mit einer MySQL-Volltextsuche. Die Volltextsuche ist erheblich schneller als die Suche mit Platzhalterzeichen, und Sie erhalten den zusätzlichen Vorteil relevanterer Ergebnisse beim Durchsuchen großer Datenbanken.
Problemfrage Nr. 5:Unoptimiertes Datenbankschema
Sie können die SQL-Abfrageleistung nur so stark verbessern, wenn Sie nicht auch Ihr Datenbankschema optimieren. Hier sind ein paar Tipps zur Verbesserung:
Tabellen normalisieren
Datenredundanz beeinträchtigt die Leistung, stellen Sie also sicher, dass Sie einen Fakt nur einmal in der Datenbank darstellen. Wenn Sie beispielsweise in mehr als einer Tabelle auf einen Kunden verweisen, verwenden Sie „Kundenname“ nur einmal und dann „Kundennummer“ für nachfolgende Verweise.
Verwenden Sie optimale Datentypen
Einige wichtige Punkte, die Sie bei Datentypen beachten sollten:
- Kürzer ist besser beim Entwerfen von Tabellen. Verwenden Sie beispielsweise den Datentyp „TINYINT“ für das Feld „user_id“ für eine Systembenutzertabelle mit weniger als 100 Benutzern.
- Verwenden Sie einen „date_time“-Datentyp, wenn ein Feld einen Datumswert erwartet, damit Sie die Datensätze nachträglich nicht in das Datumsformat konvertieren müssen.
- MySQL funktioniert besser mit ganzzahligen Werten als mit Textdatentypen, einschließlich varchar.
Vermeiden Sie Nullwerte
Nullwerte in einer Spalte können Ihre Abfrageergebnisse beeinträchtigen, daher müssen Sie möglicherweise einen Standardwert für Felder zuweisen, in denen Datensätze keinen obligatorischen Wert erfordern.
Verwenden Sie nicht zu viele Spalten
Breite Tabellen (mehr als 100 Spalten) erfordern viel CPU und Ressourcen für die Verarbeitung. Sofern Sie nicht unbedingt eine breite Tabelle einbinden müssen, ist es besser, sie in kleinere, logische Tabellen aufzuteilen.
Verbindungen optimieren
SQL-Anweisungen mit zu vielen Joins (und Joins mit zu vielen Tabellen) wirken sich negativ auf die Leistung aus. Erzielen Sie nicht mehr als 12 Joins für jede Abfrage.
Problemabfrage Nr. 6:Nicht zwischengespeicherte MySQL-Abfragen
Websites und Anwendungen, die viele ausgewählte Abfragen ausführen, profitieren vom Caching von MySQL-Abfragen. Das Caching von MySQL-Abfragen beschleunigt die Leistung während Lesevorgängen, da es die ausgewählte Abfrage zusammen mit dem resultierenden Datensatz zwischenspeichert und aus dem Speicher (nicht von der Festplatte) abruft, wenn die Abfrage mehr als einmal ausgeführt wird.
Die Leistungsoptimierung ist unerlässlich, um eine hohe Verfügbarkeit für Ihre SQL Server-Datenbanken aufrechtzuerhalten und sicherzustellen, dass Ihre Endbenutzer zufrieden sind. Aber leider ist nicht immer sofort ersichtlich, wo der Tuningbedarf am größten ist. Wenn Sie die offensichtlichen Netzwerk- und Hardwarequellen für Leistungsprobleme eliminiert haben, verlagern Sie Ihren Fokus auf Ihre Abfragen.
Wenn Sie längere Zeit als DBA gearbeitet haben, sind Sie wahrscheinlich auf eine (oder alle) dieser Problemabfragen gestoßen. Jetzt, da Sie wissen, worauf Sie achten müssen, sollten Sie bei Ihrer Initiative zur Leistungsverbesserung proaktiv vorgehen und diese häufigen Schwachstellen bei Abfragen beheben, damit Sie die Früchte der SQL Server-Abfrageoptimierung ernten können.