Dieser Artikel bietet Ihnen eine detaillierte Einführung in den MySQL-Ausführungsprozess und den Abfrage-Cache. Ich hoffe, dass er für Sie hilfreich ist.
MySQL führt einen Abfrageprozess aus:
Was genau macht MySQL, wenn wir eine Anfrage an MySQL senden:
1 an den Server
2. Der Server überprüft zunächst den Abfrage-Cache. Wenn der Cache erreicht wird, gibt er sofort die im Cache gespeicherten Ergebnisse zurück. Andernfalls fahren Sie mit der nächsten Stufe fort.
3. Der Server führt eine SQL-Analyse und Vorverarbeitung durch und dann generiert der Optimierer den entsprechenden Ausführungsplan.
4. MySQL ruft die API der Speicher-Engine auf, um die Abfrage basierend auf dem vom Optimierer generierten Ausführungsplan auszuführen
5.
MySQL besteht hauptsächlich aus zwei Teilen: der Serverschicht und der Speicherschicht.
Die Serverschicht umfasst hauptsächlich Konnektoren, Abfrage-Cache, Analysatoren, Optimierer und Executoren.
Die Speicherschicht wird hauptsächlich zum Speichern und Abfragen von Daten verwendet. Zu den häufig verwendeten Speicher-Engines gehören InnoDB, MyISAM,
(1) MySQL-Client/Server-Kommunikationsprotokoll
MySQL-Client und Die Kommunikation Das Protokoll zwischen den Servern ist „Halbduplex“, was bedeutet, dass entweder der Server zu jedem Zeitpunkt Daten an den Client sendet oder dass der Client Daten an den Server sendet. Wir können und müssen also nicht eine Nachricht in kleine Stücke schneiden und sie unabhängig voneinander versenden.
Vor- und Nachteile:
Dieses Protokoll macht die MySQL-Kommunikation einfach und schnell, schränkt MySQL aber auch an vielen Stellen ein.
Eine offensichtliche Einschränkung besteht darin, dass dies keine Flusskontrolle bedeutet. Sobald ein Ende mit dem Senden einer Nachricht beginnt, muss das andere Ende die gesamte Nachricht empfangen, bevor es darauf antworten kann. Es ist wie beim Apportierspiel: Zu jedem Zeitpunkt kann nur eine Person den Ball kontrollieren, und nur die Person, die den Ball kontrolliert, kann den Ball zurückwerfen (eine Nachricht senden).
(2). Connector
MySQL-Client und -Server stellen eine Verbindung her und erhalten die Berechtigungen des aktuell verbundenen Benutzers
(3) Abfragecache
Wenn der Abfrage-Cache aktiviert ist, überprüft MySQL vor dem Parsen einer Abfrageanweisung den Cache, um festzustellen, ob die Daten im Abfrage-Cache gefunden werden. Diese Prüfung wird über eine Hash-Suche unter Berücksichtigung der Groß- und Kleinschreibung implementiert. Selbst wenn zwischen der
-Abfrage und der Abfrage im Cache nur ein Byte Unterschied besteht, stimmt sie nicht mit dem zwischengespeicherten Ergebnis überein. In diesem Fall tritt die Abfrage
in die nächste Verarbeitungsstufe ein.
Wenn die aktuelle Abfrage zufällig den Abfragecache erreicht, überprüft MySQL einmal die Benutzerberechtigungen, bevor die Abfrageergebnisse zurückgegeben werden. Dies erfordert immer noch kein Parsen der SQL-Anweisung der Abfrage, da die Tabelleninformationen, auf die die aktuelle Abfrage zugreifen muss, bereits im Abfragecache gespeichert sind. Wenn kein Problem mit den Berechtigungen besteht, überspringt MySQL alle anderen Schritte, holt das Ergebnis direkt aus dem Cache und gibt es an den Client zurück. In diesem Fall wird die Abfrage nicht analysiert, es wird kein Ausführungsplan generiert und sie wird nicht ausgeführt.
ps: Beachten Sie, dass die Abfrage-Cache-Funktion nach MySQL8 nicht mehr verfügbar ist, da dieser Cache verfügbar ist sehr einfach zu löschen. Die Trefferquote ist relativ gering.
Der Analysator führt hauptsächlich eine syntaktische und semantische Analyse von SQL-Anweisungen durch, prüft, ob Wörter falsch geschrieben sind und prüft, ob die abzufragende Tabelle oder das abzufragende Feld vorhanden ist
(4) Abfrageoptimierung
Abfrage Der nächste Schritt im Lebenszyklus besteht darin, eine SQL in einen Ausführungsplan umzuwandeln. Anschließend interagiert MySQL gemäß diesem Ausführungsplan mit der Speicher-Engine. Dies umfasst mehrere Unterphasen: SQL-Analyse, Vorverarbeitung, Optimierung des SQ-Ausführungsplans.
Jeder Fehler in diesem Prozess (z. B. Syntaxfehler) kann dazu führen, dass die Abfrage abgebrochen wird.
2. Über den Abfrage-Cache
(1)
MySQLs Methode zur Ermittlung von Cache-Treffern ist sehr einfach: Der Cache wird in einer Referenztabelle gespeichert und über einen Hash-Wert referenziert.
Der MySOL-Abfragecache speichert die vollständigen Ergebnisse, die von der Abfrage zurückgegeben werden. Wenn die Abfrage den Cache erreicht, gibt MySQL die Ergebnisse sofort zurück und überspringt die Parsing-, Optimierungs- und Ausführungsphasen.
Das Abfrage-Cache-System verfolgt jede an der Abfrage beteiligte Tabelle. Wenn sich diese Tabellen ändern, dann der Abfrage-Cache Alle damit verbundenen gespeicherten Daten werden ungültig.
Die Effizienz dieses Mechanismus scheint relativ gering zu sein, da es sehr wahrscheinlich ist, dass sich die Abfrageergebnisse nicht ändern, wenn sich die Datentabelle ändert. Die Kosten dieser einfachen Implementierung sind jedoch sehr gering, und dies ist sehr wichtig für ein sehr ausgelastetes System. Sehr wichtig.
Das Abfrage-Caching-System ist für Anwendungen völlig transparent. Anwendungen müssen sich nicht darum kümmern, ob MySQL Ergebnisse aus dem Abfragecache oder aus der tatsächlichen Ausführung zurückgibt. Tatsächlich sind die Ergebnisse dieser beiden Methoden genau die gleichen. Mit anderen Worten: Es ist keine Syntax erforderlich, um den Cache abzufragen. Unabhängig davon, ob die MySQL-Abfragepufferung aktiviert oder deaktiviert ist, ist dies für die Anwendung transparent.
(2) Cache-Treffer ermitteln
Bei der Bestimmung, ob ein Cache-Treffer vorliegt, analysiert, "normalisiert" oder parametrisiert MySQL Abfrageanweisungen nicht, sondern verwendet direkt SQL-Anweisungen, um andere Originalinformationen an den Client zu senden Das rüberkommt hat unterschiedliche Zeichen, wie Leerzeichen und Kommentare, und alle Unterschiede führen zu einem Cache-Fehler.
Wenn die Abfrageanweisung unsichere Daten enthält, werden diese nicht zwischengespeichert. Beispielsweise werden Abfragen, die die Funktion NOW() oder CURRENT_DATE() enthalten, nicht zwischengespeichert.
Wir hören oft: „MySQL überprüft den Abfragecache nicht, wenn die Abfrage eine undefinierte Funktion enthält.“ Diese Aussage ist falsch.
Der Abfrage-Cache von MySQL kann in vielen Fällen die Abfrageleistung verbessern. Es gibt einige Probleme, die bei der Verwendung besondere Aufmerksamkeit erfordern. Erstens führt das Einschalten des Abfragecaches zu einem zusätzlichen Verbrauch sowohl bei Lese- als auch bei Schreibvorgängen:
2 kann zwischengespeichert werden. Wenn MySQL nach Abschluss der Ausführung feststellt, dass die Abfrage nicht im Abfragecache vorhanden ist, speichert es die Ergebnisse im Abfragecache, was zu einem zusätzlichen Systemverbrauch führt.
3. Dies hat auch Auswirkungen auf Schreibvorgänge, da MySQL beim Schreiben von Daten in eine Tabelle alle Caches der entsprechenden Tabelle ungültig machen muss. Wenn der Abfragecache sehr groß oder fragmentiert ist, kann dieser Vorgang zu einem hohen Systemverbrauch führen (wenn viel Speicher für den Abfragecache festgelegt ist).
Wenn eine große Anzahl von Abfrageergebnissen im Cache gespeichert wird, kann das gesamte System während des Cache-Ungültigmachungsvorgangs für eine Weile einfrieren
Und unabhängig davon, ob sie den Cache oder die Cache-Ungültigkeitserkennung treffen, müssen sie auf diese globale Sperre warten.
Theoretisch können Sie feststellen, ob Sie die Abfrage aktivieren müssen, indem Sie die Systemeffizienz beobachten, wenn das Abfrage-Caching aktiviert oder deaktiviert ist.
Zum Beispiel sind einige zusammenfassende Berechnungsabfragen spezifisch, wie z. B. COUNT() usw. Im Allgemeinen kann das Abfrage-Caching für komplexe SELECT-Anweisungen verwendet werden. Beispielsweise sind Sortierung und Paging nach der Ausführung mehrerer Tabellen erforderlich. Diese Art von Abfrage verbraucht bei jeder Ausführung viel Geld, aber die Ergebnismenge wird zurückgegeben ist sehr klein und eignet sich sehr gut für das Abfrage-Caching.
Es ist jedoch zu beachten, dass es im Vergleich zu SELECT nur sehr wenige UPDATE-, DELETE- und INSERT-Operationen für die beteiligten Tabellen gibt.
Die direkten Daten zur Beurteilung, ob der Abfragecache effektiv ist, sind die Trefferquote. Dabei handelt es sich um das Verhältnis der über den Abfrage-Cache zurückgegebenen Ergebnisse zur gesamten Abfrage.
Allerdings ist die Cache-Trefferquote ein schwer zu beurteilender Wert. Was ist eine gute Trefferquote? Spezifische Situation, spezifische Analyse.
Solange die Effizienzsteigerung durch das Abfrage-Caching größer ist als der zusätzliche Verbrauch, der durch das Abfrage-Caching verursacht wird, ist selbst eine Trefferquote von 30 % von großem Nutzen für die Systemleistung. Darüber hinaus ist es auch wichtig, welche Abfragen zwischengespeichert werden. Beispielsweise verbraucht die zwischengespeicherte Abfrage selbst viel Geld. Selbst wenn die Cache-Trefferquote sehr niedrig ist, wirkt sich dies dennoch positiv auf die Systemleistung aus Fehler können folgende Ursachen haben:
1. Die Abfrageanweisung kann nicht zwischengespeichert werden, möglicherweise weil die Abfrage eine unsichere Funktion enthält (z. B. CURREN_DATE) oder das Abfrageergebnis zu groß ist, um zwischengespeichert zu werden. Dadurch erhöht sich der Statuswert „Cache nicht zwischengespeichert“.
2.MySQL hat diese Abfrage nie verarbeitet, daher wurden die Ergebnisse nie zwischengespeichert. 3. Eine andere Situation besteht darin, dass MySQL einige Caches „räumen“ muss, obwohl die Abfrageergebnisse zuvor zwischengespeichert wurden, weil der Speicher des Abfragecaches aufgebraucht ist, oder der Cache aufgrund der Datentabelle ungültig wird wird geändert.
Wenn es auf Ihrem Server eine große Anzahl von Cache-Fehlern gibt, aber tatsächlich die überwiegende Mehrheit der Abfragen zwischengespeichert wird, dann muss Folgendes passieren:
1. Das Abfrage-Caching wurde nicht durchgeführt noch abgeschlossen. Aufwärmen. Mit anderen Worten: MySQL hatte noch nicht die Möglichkeit, alle Abfrageergebnisse zwischenzuspeichern.
2. Die Abfrageanweisung wurde noch nie zuvor ausgeführt. Wenn Ihre Anwendung eine Abfrageanweisung nicht wiederholt ausführt, kommt es auch nach Abschluss der Aufwärmphase immer noch zu vielen Cache-Fehlern3. Zu viele Cache-Ungültigmachungsvorgänge.
(4) So konfigurieren und verwalten Sie den Abfrage-Cache
Gibt an, ob der Abfrage-Cache aktiviert werden soll. Kann auf 0FN oder DEMAND eingestellt werden. DEMAND bedeutet, dass nur Anweisungen, die eindeutig SQL_CACHE in der Abfrageanweisung angeben, im Abfragecache abgelegt werden. Diese Variable kann auf Sitzungsebene oder globaler Ebene sein
query_cache_size
Der vom Abfragecache insgesamt verwendete Speicherplatz in Bytes. Dieser Wert muss ein ganzzahliges Vielfaches von 1024 sein, andernfalls weichen die tatsächlich von MySQL zugewiesenen Daten geringfügig von den von Ihnen angegebenen Daten ab.
query_cahce_min_res_unit
Die Mindesteinheit bei der Zuweisung von Speicherblöcken im Abfragecache.
query_chache_limit
Das maximale Abfrageergebnis, das MySQL zwischenspeichern kann. Wenn das Abfrageergebnis größer als dieser Wert ist, wird es nicht zwischengespeichert. Da der Abfrage-Cache beginnt, die Daten zwischenzuspeichern, wenn die Daten generiert werden, weiß er erst, ob die Abfrageergebnisse den Grenzwert überschreiten, wenn alle Ergebnisse zurückgegeben werden.
Wenn der Grenzwert überschritten wird, erhöht MySQL die Statuswert Cache_not_cached und die Ergebnisse werden aus dem Abfragecache gelöscht. Wenn Sie im Voraus wissen, dass viele solcher Situationen auftreten, wird empfohlen,
(5) Alternative
zur Abfrageanweisung hinzuzufügen Das Prinzip der MySQL-Abfrage-Cache-Arbeit ist: Ausführung Der schnellste Weg, eine Abfrage durchzuführen, besteht darin, sie nicht auszuführen, aber die Abfrage muss trotzdem an den Server gesendet werden, und der Server muss noch ein wenig Arbeit leisten. Was würde passieren, wenn für einige Abfragen keine Kommunikation mit dem Server erforderlich wäre? Der Cache des Clients kann Ihnen zu einem großen Teil dabei helfen, den Druck auf den MySQL-Server zu verteilen
Zusammenfassung:
Genau das Gleiche: Wenn eine Abfrage wiederholt ausgeführt wird, kann der Abfragecache die Ergebnisse sofort zurückgeben, ohne dass eine erneute Ausführung in der Datenbank erforderlich ist. Unserer Erfahrung nach führt die Abfrage des Caches in einer Umgebung mit hohem Parallelitätsdruck zu einer Verringerung der Systemleistung oder sogar zum Einfrieren.
Wenn Sie den Abfragecache verwenden müssen, legen Sie nicht zu viel Speicher fest und verwenden Sie ihn nur, wenn die Vorteile bestätigt werden.
Wie kann man beurteilen, ob der Abfragecache verwendet werden sollte? Es wird empfohlen, den Percona-Server zu verwenden, detailliertere Protokolle zu beobachten und einige einfache Berechnungen durchzuführen. Sie können sich auch das Cache-Trefferverhältnis (nicht immer nützlich), das „NSERTS-zu-SELECT-Verhältnis“ (dieser Parameter ist ebenfalls nicht intuitiv) oder das „Treffer-zu-Schreibverhältnis“ (dieser Verweis ist aussagekräftiger) ansehen.
Der Abfragecache ist ein sehr praktischer Cache, der für die Anwendung völlig transparent ist und keine zusätzliche Codierung erfordert. Wenn Sie jedoch eine höhere Caching-Effizienz wünschen, empfehlen wir die Verwendung von Cache oder anderen ähnlichen Lösungen.
[Verwandte Empfehlungen: MySQL-Video-Tutorial]
Das obige ist der detaillierte Inhalt vonEine detaillierte Einführung in den MySQL-Ausführungsprozess und den Abfrage-Cache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!