Heim >Datenbank >MySQL-Tutorial >wie MySQL funktioniert
Logische Architektur von MySQL
Die logische Architektur von MySQL ist in drei Schichten unterteilt. Die oberste Schicht ist die Client-Schicht, die nicht nur für MySQL gilt. Es werden alle Funktionen wie Verbindungsverarbeitung, Autorisierungsauthentifizierung und Sicherheit verwaltet in dieser Schicht.
Die meisten Kerndienste von MySQL befinden sich in der mittleren Schicht, einschließlich Abfrageanalyse, Analyse, Optimierung, Caching, integrierten Funktionen (Zeit, Mathematik, Verschlüsselung usw.) und allen speicherübergreifenden Engine-Funktionen auch in dieser Schichtimplementierung: gespeicherte Prozeduren, Trigger, Ansichten usw.
Die unterste Schicht ist die Speicher-Engine, die für die Datenspeicherung und den Abruf in MySQL verantwortlich ist. Die mittlere Service-Schicht kommuniziert mit der Speicher-Engine über APIs. Diese API-Schnittstellen schirmen die Unterschiede zwischen verschiedenen Speicher-Engines ab.
MySQL-Abfrageprozess
Beim Senden einer Anfrage an MySQL:
1. Client/Server-Kommunikationsprotokoll
Das MySQL-Client/Server-Kommunikationsprotokoll ist „Halbduplex“: Zu jeder Zeit sendet der Server Daten an den Client , oder der Client sendet Daten an den Server. Diese beiden Aktionen können nicht gleichzeitig erfolgen. Sobald ein Ende beginnt, eine Nachricht zu senden, muss das andere Ende die gesamte Nachricht empfangen, bevor es darauf antworten kann. Daher können und müssen wir eine Nachricht nicht in kleine Stücke zerschneiden und sie unabhängig voneinander senden, und es gibt keine Möglichkeit, dies zu kontrollieren fließen.
Der Client sendet die Abfrageanforderung in einem separaten Datenpaket an den Server. Wenn die Abfrageanweisung also sehr lang ist, muss der Parameter max_allowed_packet festgelegt werden. Es ist jedoch zu beachten, dass der Server bei einer zu großen Abfrage die Annahme weiterer Daten verweigert und eine Ausnahme auslöst.
Im Gegenteil, die Daten, die der Server dem Benutzer antwortet, sind normalerweise viele Daten, die aus mehreren Datenpaketen bestehen. Wenn der Server jedoch auf die Anfrage des Clients antwortet, muss der Client das gesamte zurückgegebene Ergebnis vollständig akzeptieren, anstatt einfach die ersten paar Ergebnisse zu nehmen und dann den Server aufzufordern, das Senden zu beenden. Daher ist es in der tatsächlichen Entwicklung eine sehr gute Angewohnheit, Abfragen so einfach wie möglich zu halten und nur die erforderlichen Daten zurückzugeben und die Größe und Anzahl der Datenpakete während der Kommunikation zu reduzieren. Dies ist auch der Grund, warum wir versuchen, die Verwendung von SELECT zu vermeiden * und Hinzufügen von LIMIT-Einschränkungen in Abfragen eins.
2. Abfrage-Cache
Wenn der Abfrage-Cache aktiviert ist, prüft MySQL vor dem Parsen einer Abfrage-Anweisung, ob die Abfrage-Anweisung auf die Daten im Abfrage-Cache trifft . Wenn die aktuelle Abfrage zufällig den Abfragecache trifft, werden die Ergebnisse im Cache direkt nach der einmaligen Überprüfung der Benutzerberechtigungen zurückgegeben. In diesem Fall wird die Abfrage nicht analysiert, kein Ausführungsplan generiert und nicht ausgeführt.
MySQL speichert den Cache in einer Referenztabelle (einer Datenstruktur ähnlich wie HashMap), indiziert durch einen Hash-Wert. Dieser Hash-Wert wird durch die Abfrage selbst, die aktuell abgefragte Datenbank und die Versionsnummer des Client-Protokolls bestimmt usw. Es werden einige Informationen berechnet, die sich auf die Ergebnisse auswirken können. Daher führt jeder Unterschied in den Zeichen zwischen den beiden Abfragen (Leerzeichen, Kommentare) dazu, dass der Cache fehlt.
Wenn die Abfrage benutzerdefinierte Funktionen, gespeicherte Funktionen, Benutzervariablen, temporäre Tabellen oder Systemtabellen in der MySQL-Bibliothek enthält, werden die Abfrageergebnisse nicht zwischengespeichert. Beispielsweise gibt die Funktion NOW() oder CURRENT_DATE() aufgrund unterschiedlicher Abfragezeiten unterschiedliche Ergebnisse zurück. Ein weiteres Beispiel ist, dass die Abfrageanweisung, die CURRENT_USER oder CONNECION_ID() enthält, aufgrund unterschiedlicher Benutzer unterschiedliche Ergebnisse zurückgibt. Es ergibt keinen Sinn.
3. Cache-Ungültigmachung
Das Abfrage-Cache-System von MySQL verfolgt jede an der Abfrage beteiligte Tabelle (Daten oder Struktur), und alle werden zwischengespeichert Daten, die sich auf diese Tabelle beziehen, werden ungültig. Aus diesem Grund muss MySQL bei jedem Schreibvorgang alle Caches für die entsprechende Tabelle ungültig machen. Wenn der Abfragecache sehr groß oder fragmentiert ist, kann dieser Vorgang zu einer hohen Systemauslastung führen und sogar dazu führen, dass das System für eine Weile einfriert. Darüber hinaus wird der Abfragecache auf dem System nicht nur für Schreibvorgänge, sondern auch für Lesevorgänge zusätzlich beansprucht:
1 Jede Abfrageanweisung muss vor dem Start überprüft werden, auch wenn diese SQL-Anweisung niemals einen Treffer erzielt Caching
2. Wenn die Abfrageergebnisse zwischengespeichert werden können, werden die Ergebnisse nach Abschluss der Ausführung im Cache gespeichert, was ebenfalls zu einem zusätzlichen Systemverbrauch führt
Auf dieser Grundlage Sie müssen wissen, was es nicht ist. In diesem Fall verbessert das Abfrage-Caching die Systemleistung, und das Caching und die Invalidierung führen zu einem zusätzlichen Verbrauch. Nur wenn die durch das Caching verursachten Ressourceneinsparungen größer sind als die selbst verbrauchten Ressourcen, führt dies zu Leistungsverbesserungen zum System. Es ist jedoch sehr schwierig zu beurteilen, ob das Einschalten des Caches zu Leistungsverbesserungen führen kann. Wenn das System einige Leistungsprobleme hat, können Sie versuchen, den Abfragecache zu aktivieren und einige Optimierungen im Datenbankdesign vorzunehmen: Zum Beispiel:
1 Verwenden Sie mehrere kleine Tabellen anstelle einer großen Tabelle Achten Sie darauf, nicht zu viel zu entwerfen
2. Batch-Einfügung statt zyklischer Einzeleinfügung
3 Im Allgemeinen ist es angemessener, die Größe auf Dutzende festzulegen Megabyte
4. Sie können SQL_CACHE und SQL_NO_CACHE verwenden, um zu steuern, ob eine bestimmte Abfrageanweisung zwischengespeichert werden muss
Aktivieren Sie den Abfragecache nicht einfach, insbesondere bei schreibintensiven Anwendungen. Wenn Sie wirklich nichts dagegen tun können, können Sie query_cache_type auf DEMAND setzen. Zu diesem Zeitpunkt werden nur Abfragen zwischengespeichert, andere Abfragen nicht. Auf diese Weise können Sie frei steuern, welche Abfragen zwischengespeichert werden müssen.
4. Syntaxanalyse und Vorverarbeitung
MySQL analysiert die SQL-Anweisung anhand von Schlüsselwörtern und generiert einen entsprechenden Analysebaum. Dieser Prozessparser überprüft und analysiert hauptsächlich Grammatikregeln. Zum Beispiel, ob in SQL die falschen Schlüsselwörter verwendet werden oder ob die Reihenfolge der Schlüsselwörter korrekt ist usw. Bei der Vorverarbeitung wird außerdem geprüft, ob der Parse-Baum gemäß den MySQL-Regeln zulässig ist. Überprüfen Sie beispielsweise, ob die abzufragende Datentabelle und Datenspalte vorhanden ist usw.
5. Abfrageoptimierung
Nachdem der Syntaxbaum als zulässig erachtet wurde und der Optimierer ihn in einen Abfrageplan umwandelt, kann eine Abfrage in den meisten Fällen viele Alle haben Ausführungsmethoden geben schließlich entsprechende Ergebnisse zurück. Die Rolle des Optimierers besteht darin, den besten Ausführungsplan unter ihnen zu finden.
Der Abfrageoptimierer von MySQL ist eine sehr komplexe Komponente. Er verwendet viele Optimierungsstrategien, um einen optimalen Ausführungsplan zu generieren:
1. Definieren Sie die Zuordnungsreihenfolge der Tabelle neu. Sie folgen nicht unbedingt der in SQL angegebenen Reihenfolge, es gibt jedoch einige Techniken, um die Reihenfolge der Zuordnung festzulegen)
2. Optimieren Sie die Funktionen MIN() und MAX() (ermitteln Sie den Mindestwert einer bestimmten Spalte ) Wert, wenn die Spalte einen Index hat, müssen Sie nur das äußerste linke Ende des B+Tree-Index finden, andernfalls können Sie den Maximalwert finden)
3 Beenden Sie die Abfrage vorzeitig (bei Verwendung von Limit, Nachdem Sie eine Ergebnismenge gefunden haben, die der Anzahl entspricht, beenden Sie die Abfrage sofort)
4. Optimieren Sie die Sortierung (in der alten Version von MySQL werden zwei Übertragungssortierungen verwendet, d Felder, die sortiert werden müssen, sortieren Sie sie im Speicher und sortieren Sie sie dann entsprechend den Sortierergebnissen. Lesen Sie die Datenzeilen. Die neue Version verwendet die Einzelübertragungssortierung, dh das Lesen aller Datenzeilen auf einmal und das anschließende Sortieren zu den angegebenen Spalten)
6. Abfrageausführungs-Engine
Nach Abschluss der Parsing- und Optimierungsphasen generiert MySQL den entsprechenden Ausführungsplan und die Abfrageausführungs-Engine Führen Sie die Anweisungen schrittweise gemäß dem Ausführungsplan aus, um die Ergebnisse zu erhalten. Die meisten Vorgänge im gesamten Ausführungsprozess werden durch den Aufruf von Schnittstellen abgeschlossen, die von der Speicher-Engine implementiert werden. Diese Schnittstellen werden Handler-APIs genannt. Jede Tabelle im Abfrageprozess wird durch eine Handler-Instanz dargestellt. Tatsächlich erstellt MySQL während der Abfrageoptimierungsphase eine Handler-Instanz basierend auf den Schnittstellen dieser Instanzen, einschließlich aller Spaltennamen , Indexstatistiken usw. der Tabelle. Die Schnittstelle der Speicher-Engine bietet sehr umfangreiche Funktionen, aber unten gibt es nur Dutzende Schnittstellen. Diese Schnittstellen vervollständigen wie Tower Blocks die meisten Vorgänge einer Abfrage.
7. Rückgabe der Ergebnisse an den Client
Der letzte Schritt der Abfrageausführung besteht darin, die Ergebnisse an den Client zurückzugeben. Auch wenn keine Daten abgefragt werden können, gibt MySQL dennoch Informationen zur Abfrage zurück, z. B. die Anzahl der von der Abfrage betroffenen Zeilen, die Ausführungszeit usw.
Wenn der Abfrage-Cache aktiviert ist und die Abfrage zwischengespeichert werden kann, speichert MySQL auch die Ergebnisse im Cache.
Die Rückgabe des Ergebnissatzes an den Client ist ein inkrementeller und schrittweiser Rückgabeprozess. Es ist möglich, dass MySQL beginnt, die Ergebnismenge nach und nach an den Client zurückzugeben, wenn das erste Ergebnis generiert wird. Auf diese Weise muss der Server nicht zu viele Ergebnisse speichern und nicht zu viel Speicher verbrauchen, und der Client kann die zurückgegebenen Ergebnisse auch so schnell wie möglich erhalten. Es ist zu beachten, dass jede Zeile im Ergebnissatz als Datenpaket gesendet wird, das dem in ① beschriebenen Kommunikationsprotokoll entspricht, und dann über das TCP-Protokoll übertragen wird. Während des Übertragungsprozesses können MySQL-Datenpakete zwischengespeichert und dann gesendet werden Chargen.
Gesamter MySQL-Abfrageausführungsprozess
1. Der Client sendet eine Abfrageanforderung an den MySQL-Server
2. Der Server überprüft zunächst den Abfragecache Wenn der Cache getroffen wird, wird das im Cache gespeicherte Ergebnis sofort zurückgegeben. Andernfalls geben Sie das Segment der nächsten Ebene ein
3. Der Server führt eine SQL-Analyse und Vorverarbeitung durch und dann generiert der Optimierer den entsprechenden Ausführungsplan
4 den Ausführungsplan. Abfrage ausführen
Das obige ist der detaillierte Inhalt vonwie MySQL funktioniert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!