Häufige Missverständnisse
count(1) und count(primary_key) sind besser als count(*)
Um die Anzahl der Datensätze zu zählen, verwenden viele Leute count(1) und count(primary_key) anstelle von count(*). Sie glauben, dass dies eine bessere Leistung erbringt. In einigen Szenarien kann dies zu einer schlechteren Leistung führen, da die Datenbank einige spezielle Optimierungen für den Zählvorgang count(*) vorgenommen hat.
count(column) und count(*) sind gleich
Dieses Missverständnis selbst unter vielen leitenden Ingenieuren Es ist unter Datenbankadministratoren weit verbreitet und wird von vielen Menschen als selbstverständlich angesehen. Tatsächlich sind count(column) und count(*) völlig unterschiedliche Operationen und haben völlig unterschiedliche Bedeutungen.
Anzahl(Spalte) bedeutet, wie viele Datensätze in der Ergebnismenge deren Spaltenfeld nicht leer ist
Anzahl(*) bedeutet, wie viele Datensätze in der gesamten Ergebnismenge vorhanden sind
Die Auswahl von a, b aus … ermöglicht der Datenbank den Zugriff auf weniger Daten als die Auswahl von a, b, c aus …
Dieses Missverständnis ist Der Hauptgrund dafür ist, dass sie nicht viel über die Speicherprinzipien der Datenbank wissen.
Tatsächlich werden die meisten relationalen Datenbanken in Zeilen gespeichert, und Datenzugriffsvorgänge basieren auf einer E/A-Einheit fester Größe (Block oder Seite genannt ... Meistens mehrere). Zeilen werden in jeder E/A-Einheit gespeichert, und jede Zeile speichert alle Felder der Zeile (mit Ausnahme spezieller Feldtypen wie lob).
Ob wir also ein Feld oder mehrere Felder verwenden, ist die Datenmenge, auf die die Datenbank in der Tabelle zugreifen muss, tatsächlich dieselbe.
Natürlich gibt es Ausnahmen, das heißt, unsere Abfrage kann im Index abgeschlossen werden. Das heißt, wenn nur zwei Felder a und b abgerufen werden, ist es nicht erforderlich, die Tabelle zurückzugeben Das Feld c ist nicht im verwendeten Index. Sie müssen zur Tabelle zurückkehren, um deren Daten zu erhalten. In diesem Fall wird das E/A-Volumen zwischen den beiden sehr unterschiedlich sein.
Ordnung nach muss einen Sortiervorgang erfordern
Wir wissen, dass die Indexdaten tatsächlich geordnet sind, wenn unser If Die erforderlichen Daten befinden sich in derselben Reihenfolge wie ein Index und unsere Abfrage wird über diesen Index ausgeführt. Die Datenbank lässt den Sortiervorgang im Allgemeinen aus und gibt die Daten direkt zurück, da die Datenbank weiß, dass die Daten bereits unseren Sortieranforderungen entsprechen.
Tatsächlich ist die Verwendung von Indizes zur Optimierung von SQL mit Sortieranforderungen eine sehr wichtige Optimierungsmethode
Erweiterte Lektüre: Analyse der Implementierung von MySQL ORDER BY, dem grundlegenden Implementierungsprinzip von GROUP BY in MySQL und Das grundlegende Implementierungsprinzip von MySQL DISTINCT wird in diesen drei Artikeln ausführlicher analysiert, insbesondere im ersten.
Wenn der Ausführungsplan eine Dateisortierung enthält , die Festplatte wird verarbeitet Dateisortierung
Dieses Missverständnis ist nicht unsere Schuld, sondern liegt an der von MySQL-Entwicklern verwendeten Formulierung. Bei „Filesort“ handelt es sich um die Informationen, die möglicherweise in der Spalte „Extra“ angezeigt werden, wenn wir den Befehl „explain“ verwenden, um den Ausführungsplan einer SQL-Anweisung anzuzeigen.
Tatsächlich wird immer dann, wenn eine SQL-Anweisung einen Sortiervorgang erfordert, „Filesort wird verwendet“ angezeigt, was nicht bedeutet, dass ein Dateisortiervorgang durchgeführt wird.
Erweiterte Lektüre: Dateisortierung in der MySQL-Befehlsausgabe verstehen, eine ausführlichere Einführung habe ich hier
So wenige Verknüpfungen wie möglich
Der Vorteil von MySQL ist die Einfachheit, aber das ist in einigen Aspekten tatsächlich sein Nachteil. Der MySQL-Optimierer ist hocheffizient, aber aufgrund seiner begrenzten Menge an statistischen Informationen besteht eine größere Möglichkeit von Abweichungen im Arbeitsprozess des Optimierers. Bei komplexem Multi-Table-Join liegt es einerseits an der begrenzten Optimierung, andererseits wurden bei Join nur unzureichende Anstrengungen unternommen, so dass die Leistung immer noch weit hinter der von Vorgängern in relationalen Datenbanken wie Oracle zurückbleibt. Wenn es sich jedoch um eine einfache Einzeltabellenabfrage handelt, ist diese Lücke sehr gering und in einigen Szenarien sogar besser als bei diesen Datenbankvorgängern.
So wenig wie möglich sortieren
Sortiervorgänge verbrauchen mehr CPU-Ressourcen, daher kann eine Reduzierung der Sortierung Cache-Treffer reduzieren In Szenarien mit ausreichenden E/A-Funktionen wie hoher Rate wirkt sich dies stark auf die Antwortzeit von SQL aus.
Für MySQL gibt es viele Möglichkeiten, die Sortierung zu reduzieren, wie zum Beispiel:
Optimieren Sie, indem Sie den Index zum Sortieren verwenden, wie im obigen Missverständnis erwähnt
Reduzieren Sie die Anzahl der an der Sortierung beteiligten Datensätze
-
Sortieren Sie Daten nicht, es sei denn, dies ist erforderlich.
Vermeiden Sie ressourcenintensive SQL-Anweisungen mit DISTINCT, UNION, MINUS, INTERSECT, ORDER BY, um die Ausführung der SQL-Engine zu starten. Die aufwändige Sortierfunktion (SORT) erfordert einen Sortiervorgang, während andere mindestens zwei Sortiervorgänge erfordern
Das obige ist der detaillierte Inhalt vonEinige häufige Missverständnisse über Mysq. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!