Funktionsweise von SQL-SELECT-Datenbankabfragen

Funktionsweise von SQL-SELECT-Datenbankabfragen

Obwohl wir keine professionellen DBAs sind, können wir als Webentwickler nicht auf Datenbanken verzichten. Die meisten Entwickler kennen nur die vier klassischen SQL-Anweisungen: Auswählen, Einfügen, Löschen und Aktualisieren. So sehr, dass wir nie untersucht haben, wie sie funktionieren. Hier sprechen wir darüber, wie die Auswahl in der Datenbank funktioniert.

Das klassischste Thema der B/S-Architektur ist die dreischichtige Architektur, die grob in Datenschicht, Geschäftslogikschicht und Präsentationsschicht unterteilt werden kann. Die Funktion der Datenschicht besteht im Allgemeinen darin, mit der Datenbank zu interagieren, beispielsweise Datensätze abzufragen. Wir schreiben häufig SQL-Abfragen und rufen dann das Programm auf, um das SQL auszuführen. Doch wie sieht der interne Arbeitsablauf aus? Ich glaube, die meisten meiner Freunde sind sich wie ich nicht sicher, welchen Schritt sie zuerst und welchen sie als nächstes machen sollen.

Schritt 1: Die Anwendung sendet die SQL-Abfrageanweisung zur Ausführung an den Server

Wenn wir SQL-Anweisungen in der Datenschicht ausführen, stellt die Anwendung eine Verbindung zum entsprechenden Datenbankserver her und sendet die SQL-Anweisungen zur Verarbeitung an den Server.

Schritt 2: Der Server analysiert die angeforderte SQL-Anweisung

1. SQL-Plan-Cache. Freunde, die häufig den Abfrageanalysator verwenden, kennen das wahrscheinlich. Oft dauert die Ausführung einer Abfrageanweisung sehr lange, wenn sie zum ersten Mal ausgeführt wird. Wenn Sie dieselbe Anweisung jedoch sofort oder innerhalb eines bestimmten Zeitraums ausführen, werden die Abfrageergebnisse in sehr kurzer Zeit zurückgegeben.

Grund:

  • Nach dem Empfang einer Abfrageanforderung fragt der Server die Datenbank nicht sofort ab, sondern sucht im Plancache der Datenbank nach, ob ein entsprechender Ausführungsplan vorhanden ist. Wenn dies der Fall ist, ruft er den kompilierten Ausführungsplan direkt auf und spart so die Kompilierungszeit des Ausführungsplans.
  • Wenn die abgefragte Zeile bereits im Datenpufferspeicherbereich vorhanden ist, muss die physische Datei nicht abgefragt werden. Stattdessen werden die Daten aus dem Cache abgerufen. Auf diese Weise ist das Abrufen von Daten aus dem Speicher viel schneller als das Lesen von Daten von der Festplatte, wodurch die Abfrageeffizienz verbessert wird. Der Datenpufferspeicherbereich wird später erwähnt.

2. Wenn im SQL-Plan-Cache kein entsprechender Ausführungsplan vorhanden ist, führt der Server zunächst eine Syntaxüberprüfung der vom Benutzer angeforderten SQL-Anweisung durch. Wenn ein Syntaxfehler vorliegt, beendet der Server den Abfragevorgang und gibt die entsprechende Fehlermeldung an die Anwendung zurück, die ihn aufgerufen hat.

Hinweis: Die zu diesem Zeitpunkt zurückgegebene Fehlermeldung enthält nur grundlegende Syntaxfehlerinformationen, z. B. „select“ als „selec“ geschrieben. Wenn die Fehlermeldung eine Spalte enthält, die in der Tabelle nicht vorhanden ist, überprüft der Server sie zu diesem Zeitpunkt nicht, da es sich nur um eine Syntaxüberprüfung handelt. Ob die Semantik korrekt ist, wird im nächsten Schritt behandelt.

3. Nachdem die Syntax übereinstimmt, wird überprüft, ob die Semantik korrekt ist, z. B. ob Tabellennamen, Spaltennamen, gespeicherte Prozeduren und andere Datenbankobjekte tatsächlich vorhanden sind. Wenn festgestellt wird, dass einige davon nicht vorhanden sind, wird der Anwendung ein Fehler gemeldet und die Abfrage wird beendet.

4. Der nächste Schritt besteht darin, die Parsing-Sperre des Objekts zu erhalten. Wenn wir eine Tabelle abfragen, sperrt der Server zuerst das Objekt, um die Konsistenz der Daten sicherzustellen. Wenn es nicht gesperrt ist, werden zu diesem Zeitpunkt Daten eingefügt, aber da keine Sperre vorhanden ist, hat die Abfrage den Datensatz gelesen und einige Einfügungen werden aufgrund von Transaktionsfehlern zurückgesetzt, was zu fehlerhaften Lesevorgängen führt.

5. Der nächste Schritt besteht darin, die Berechtigungen des Datenbankbenutzers zu überprüfen. Selbst wenn die Syntax und Semantik der SQL-Anweisung korrekt sind, werden die Abfrageergebnisse zu diesem Zeitpunkt möglicherweise nicht abgerufen. Wenn der Datenbankbenutzer nicht über die entsprechenden Zugriffsrechte verfügt, meldet der Server der Anwendung einen Fehler wegen unzureichender Berechtigungen. In größeren Projekten gibt es in einem Projekt häufig mehrere Datenbankverbindungszeichenfolgen. Diese Datenbankbenutzer haben unterschiedliche Berechtigungen, einige sind schreibgeschützt, einige nur lesbar und einige lesbar und beschreibbar. Verschiedene Benutzer werden für die Ausführung entsprechend unterschiedlicher Vorgänge ausgewählt. Wenn Sie nicht vorsichtig sind, ist Ihre SQL-Anweisung nutzlos, egal wie perfekt sie ist.

6. Der letzte Schritt der Analyse besteht darin, den endgültigen Ausführungsplan festzulegen. Nachdem Syntax, Semantik und Berechtigungen überprüft wurden, gibt der Server die Ergebnisse nicht sofort an Sie zurück. Stattdessen optimiert er Ihr SQL und wählt verschiedene Abfragealgorithmen aus, um sie in der effizientesten Form an die Anwendung zurückzugeben. Wenn Sie beispielsweise eine Tabellenverknüpfungsabfrage durchführen, entscheidet der Server letztendlich, ob Hashjoin, Mergejoin oder Loopjoin verwendet werden soll. Dies hängt von den Kosten, dem effizienteren Index usw. ab. Die automatische Optimierung ist jedoch begrenzt. Wenn Sie effizientes Abfrage-SQL schreiben möchten, müssen Sie Ihre SQL-Abfrageanweisungen dennoch optimieren.

Sobald der Ausführungsplan festgelegt ist, wird er im SQL-Plan-Cache gespeichert. Bei der nächsten Ausführungsanforderung wird er direkt aus dem Plan-Cache entnommen, um eine Neukompilierung des Ausführungsplans zu vermeiden.

Schritt 3: Anweisungsausführung

Nachdem der Server die SQL-Anweisung analysiert hat, weiß er, was die Anweisung tatsächlich bedeutet und kann sie dann tatsächlich ausführen.

Derzeit gibt es zwei Situationen:

  • Wenn die in der Abfrageanweisung enthaltenen Datenzeilen in den Datenpufferspeicherbereich gelesen wurden, liest der Server die Daten direkt aus dem Datenpufferspeicherbereich und gibt sie an die Anwendung zurück. Dadurch wird das Lesen aus der physischen Datei vermieden und die Abfragegeschwindigkeit verbessert.
  • Wenn sich die Datenzeile nicht im Datenpufferspeicherbereich befindet, wird der Datensatz aus der physischen Datei gelesen und an die Anwendung zurückgegeben, und die Datenzeile wird für die nächste Verwendung in den Datenpufferspeicherbereich geschrieben.

Hinweis: Es gibt verschiedene Arten von SQL-Caches. Interessierte Freunde können hier danach suchen. Manchmal ist es aufgrund der Existenz von Caches schwierig für uns, die Optimierungsergebnisse sofort zu sehen. Da die zweite Ausführung aufgrund der Existenz von Caches sehr schnell ist, löschen wir normalerweise zuerst den Cache und vergleichen dann die Leistung vor und nach der Optimierung. Hier sind einige gängige Methoden:

DBCC DROPCLEANBUFFERS

Entfernt alle leeren Puffer aus dem Pufferpool.

DBCC FREEPROCCACHE

Entfernt alle Elemente aus dem Prozedurcache.

DBCC FREESYSTEMCACHE

Gibt alle ungenutzten Cache-Einträge aus allen Caches frei.

Die SQL Server 2005-Datenbank-Engine bereinigt im Hintergrund vorab nicht verwendete Cache-Einträge, um Speicher für aktuelle Einträge freizugeben. Sie können jedoch mit diesem Befehl nicht verwendete Einträge manuell aus allen Caches entfernen.

Dies kann nur grundsätzlich die Auswirkungen des SQL-Caches beseitigen. Es scheint keine Lösung zu geben, um den Cache vollständig zu beseitigen. Wenn Sie eine haben, lassen Sie es mich bitte wissen.

Fazit: Nur wenn wir den Betriebsablauf des Dienstes kennen, der das von der Anwendung übermittelte SQL ausführt, können wir unsere Anwendung gut debuggen.

  • Stellen Sie sicher, dass die SQL-Syntax korrekt ist.
  • Stellen Sie die semantische Korrektheit von SQL sicher, d. h., ob das Objekt existiert.
  • Ob der Datenbankbenutzer über die entsprechenden Zugriffsrechte verfügt.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Wenn Sie mehr darüber erfahren möchten, schauen Sie sich bitte die folgenden Links an

Das könnte Sie auch interessieren:
  • Konfiguration der MySQL-Master/Slave-Datenbanksynchronisierung und häufige Fehler
  • PHP-Singleton-Modus-Datenbankverbindungsklasse und statische Seitenimplementierungsmethode
  • Zwei Ideen zur Implementierung der horizontalen Datenbanksegmentierung
  • Problem mit der Groß-/Kleinschreibung in der MySQL-Datenbank
  • Python verwendet adbapi, um die asynchrone Speicherung einer MySQL-Datenbank zu implementieren
  • Sprechen Sie über Ihre Erfahrungen im Datenbankfelddesign
  • Der Unterschied zwischen gespeicherten Prozeduren und Transaktionen in MySQL-Datenbanken
  • Bedeutung und Berechnungsmethode von QPS und TPS der MySQL-Datenbank
  • So sichern und wiederherstellen Sie die MySQL-Datenbank, wenn sie zu groß ist
  • Wie Sie die redundanten Felder der Datenbank sinnvoll nutzen

<<:  Detaillierte Erläuterung des direkten Routings bei der hostübergreifenden Kommunikation von Docker-Containern

>>:  Implementierungsprozessdatensatz für benutzerdefinierte Vue-Tabellenspalten

Artikel empfehlen

react-beautiful-dnd implementiert die Drag-and-Drop-Funktion für Komponenten

Inhaltsverzeichnis 1. Installation 2.API 3. reagi...

Details zum JavaScript-Abschluss

Inhaltsverzeichnis 1. Was ist ein Abschluss? 2. D...

So ändern Sie das MySQL-Passwort unter Centos

1. MySQL-Anmeldeeinstellungen ändern: # vim /etc/...

React realisiert sekundäre Verknüpfung (linke und rechte Verknüpfung)

In diesem Artikel wird der spezifische Code von R...

Tutorial zur Verwendung von Docker Compose zum Erstellen von Confluence

Dieser Artikel verwendet die Lizenzvereinbarung „...

Css3 realisiert nahtloses Scrollen und Anti-Shake

Frage Das nahtlose Scrollen von Bildern und Texte...

Zwei Möglichkeiten zum Öffnen und Schließen des MySQL-Dienstes

Methode 1: Verwenden Sie den cmd-Befehl Öffnen Si...

So implementieren Sie das Rasterlayout mit Intervallen perfekt auf der Seite

Typische Layoutbeispiele Wie im obigen Bild gezei...

Eine kurze Einführung in MySQL InnoDB ReplicaSet

Inhaltsverzeichnis 01 Einführung in InnoDB Replic...

Detaillierter Installationsprozess der MySQL 8.0 Windows-ZIP-Paketversion

Der Installationsprozess von MySQL 8.0 Windows Zi...