Heim  >  Artikel  >  Datenbank  >  MySQL-Architektur

MySQL-Architektur

巴扎黑
巴扎黑Original
2017-06-23 14:50:581006Durchsuche

Sehen Sie sich das erste Kapitel der MySQL-Architektur und die Geschichte von „High Performance MySQL“ an

1.1 MySQL Logical Architecture

Referenz

Abbildung 1-1: Diagramm der logischen Architektur des MySQL-Servers

Die Top-Level-Dienste gibt es nicht nur bei MySQL, die meisten sind netzwerkbasiert Client/Server-Tools oder -Dienste haben eine ähnliche Architektur. Wie Verbindungsverarbeitung, Autorisierungsauthentifizierung, Sicherheit usw.

Die Second-Layer-Architektur ist der interessantere Teil von MySQL. Die meisten Kerndienstfunktionen von MySQL befinden sich in dieser Ebene, einschließlich Abfrageanalyse, Analyse, Optimierung, Caching und allen integrierten Funktionen (z. B. Datum, Uhrzeit, Mathematik und Verschlüsselungsfunktionen). Alle speicherübergreifenden Engine-Funktionen befinden sich in dieser Ebene Schichtimplementierung: gespeicherte Prozeduren, Trigger, Ansichten usw.

Die dritte Schicht enthält die Speicher-Engine. Die Speicher-Engine ist für das Speichern und Abrufen von Daten in MySQL verantwortlich. Wie verschiedene Dateisysteme unter GNU/Linux hat jede Speicher-Engine ihre Vor- und Nachteile. Der Server kommuniziert über APIs mit der Speicher-Engine. Diese Schnittstellen schirmen die Unterschiede zwischen verschiedenen Speicher-Engines ab und machen diese Unterschiede für den Abfrageprozess der oberen Ebene transparent. Die Storage-Engine-API enthält Dutzende Low-Level-Funktionen zum Ausführen von Vorgängen wie „Starten einer Transaktion“ oder „Extrahieren einer Datensatzzeile basierend auf dem Primärschlüssel“. Die Speicher-Engine analysiert jedoch kein SQL und verschiedene Speicher-Engines kommunizieren nicht miteinander, sondern reagieren lediglich auf die Anfrage des übergeordneten Servers.

1.2 Parallelitätskontrolle

1.2.1 Lese-/Schreibsperre

Diese beiden Arten von Sperren werden normalerweise als gemeinsame Sperren und exklusive Sperren bezeichnet, auch Lesesperre (Lesesperre) genannt. und Schreibsperre (Schreibsperre). Lesesperren sind gemeinsam genutzt oder nicht blockierend. Mehrere Clients können gleichzeitig dieselbe Ressource lesen, ohne sich gegenseitig zu stören. Schreibsperren sind exklusiv, das heißt, eine Schreibsperre blockiert andere Schreibsperren und Lesesperren.

1.2.2 Sperrgranularität

Die beiden wichtigsten Sperrstrategien: Tabellensperre und Sperre auf Zeilenebene

Tabellensperre (Tabellensperre)

Tabelle Sperren sind die grundlegendste Sperrstrategie in MySQL und die kostengünstigste Strategie. Dadurch wird die gesamte Tabelle gesperrt. Bevor ein Benutzer Schreibvorgänge (Einfügen, Löschen, Aktualisieren usw.) für die Tabelle ausführen kann, muss er eine Schreibsperre erhalten, die alle Lese- und Schreibvorgänge anderer Benutzer für die Tabelle blockiert. Nur wenn keine Schreibsperre vorhanden ist, können andere lesende Benutzer die Lesesperre erhalten und Lesesperren blockieren sich nicht gegenseitig.

Tabellensperren können in bestimmten Szenarien auch eine gute Leistung erbringen. Beispielsweise unterstützen READ LOCAL-Tabellensperren bestimmte Arten gleichzeitiger Schreibvorgänge. Darüber hinaus haben Schreibsperren auch eine höhere Priorität als Lesesperren, sodass eine Schreibsperranforderung vor der Lesesperrenwarteschlange eingefügt werden kann (eine Schreibsperre kann vor einer Lesesperre in die Sperrwarteschlange eingefügt werden, während eine Lesesperre vor einer Lesesperre eingefügt werden kann (Schreibsperre kann nicht eingesetzt werden) an der Vorderseite der Schreibsperre).

Sperre auf Zeilenebene (Zeilensperre)

Sperre auf Zeilenebene kann die gleichzeitige Verarbeitung weitestgehend unterstützen (bringt aber auch den größten Sperraufwand mit sich). Wie wir alle wissen, ist das Sperren auf Zeilenebene in InnoDB und XtraDB sowie einigen anderen Speicher-Engines implementiert. Sperren auf Zeilenebene werden nur auf der Ebene der Speicher-Engine implementiert, nicht jedoch auf der Ebene des MySQL-Servers. Die Serverschicht hat keine Kenntnis von der Sperrimplementierung in der Speicher-Engine.

1.3 Transaktionen

Transaktionen unterstützen die ACID-Prinzipien.

Atomizität

Eine Transaktion muss als unteilbare Mindestarbeitseinheit betrachtet werden.

Konsistenz

Die Datenbank wechselt immer von einem konsistenten Zustand in einen anderen konsistenten Zustand.

Isolierung

Im Allgemeinen sind von einer Transaktion vorgenommene Änderungen für andere Transaktionen nicht sichtbar, bevor sie endgültig festgeschrieben werden.

Dauerhaftigkeit

Sobald eine Transaktion festgeschrieben wurde, werden ihre Änderungen dauerhaft in der Datenbank gespeichert.

1.3.1 Isolationsstufe

Im Folgenden finden Sie eine kurze Einführung in die vier Isolationsstufen.

READ UNCOMMITTED (nicht festgeschriebenes Lesen)

Auf der Ebene READ UNCOMMITTED sind Änderungen in einer Transaktion für andere Transaktionen sichtbar, auch wenn sie nicht festgeschrieben sind. Transaktionen können nicht festgeschriebene Daten lesen, was auch als Dirty Read bezeichnet wird. In Bezug auf die Leistung kann READ UNCOMMITTED nicht viel besser sein als andere Ebenen, es fehlen jedoch viele Vorteile anderer Ebenen, es sei denn, es gibt wirklich notwendige Gründe. .

engagiert lesen

Die Standardisolationsstufe der meisten Datenbanksysteme ist READ COMMITTED (jedoch nicht MySQL). Alle von einer Transaktion vom Anfang bis zum Commit vorgenommenen Änderungen sind für andere Transaktionen nicht sichtbar. Diese Ebene wird manchmal als nicht wiederholbares Lesen bezeichnet, da die zweimalige Ausführung derselben Abfrage zu unterschiedlichen Ergebnissen führen kann.

REPEATABLE READ (wiederholbares Lesen)

  REPEATABLE READ löst das Problem des schmutzigen Lesens. Auf dieser Ebene wird sichergestellt, dass die Ergebnisse beim mehrmaligen Lesen desselben Datensatzes in derselben Transaktion konsistent sind. Theoretisch kann die wiederholbare Leseisolationsstufe jedoch immer noch kein anderes Phantomleseproblem (Phantom Read) lösen. Der sogenannte Phantom-Leser bedeutet, dass eine andere Transaktion einen neuen Datensatz in den Bereich einfügt, wenn eine Transaktion Datensätze in einem bestimmten Bereich liest. Wenn die vorherige Transaktion die Datensätze in dem Bereich erneut liest, erzeugt sie eine Phantomzeile. InnoDB- und XtraDB-Speicher-Engines lösen das Problem von Phantom-Lesevorgängen durch Multiversion Concurrency Control (MVCC).

Wiederholbares Lesen ist die Standard-Transaktionsisolationsstufe von MySQL.

SERIALIZABLE (serialisierbar)

SERIALIZABLE ist die höchste Isolationsstufe. Es vermeidet das zuvor erwähnte Phantomleseproblem, indem es die serielle Ausführung von Transaktionen erzwingt. Einfach ausgedrückt sperrt SERIALIZABLE jede abgerufene Datenzeile, was zu vielen Zeitüberschreitungen und Sperrkonfliktproblemen führen kann. Diese Isolationsstufe wird in tatsächlichen Anwendungen selten verwendet. Diese Stufe sollte nur in Betracht gezogen werden, wenn die Datenkonsistenz unbedingt gewährleistet sein muss und keine Parallelität akzeptabel ist.

1.3.2 Deadlock

Deadlock bezieht sich auf zwei oder mehr Transaktionen, die sich gegenseitig auf derselben Ressource belegen und anfordern, die voneinander belegten Ressourcen zu sperren, was zu The führt Phänomen des Teufelskreises. Deadlocks können auftreten, wenn mehrere Transaktionen versuchen, Ressourcen in unterschiedlicher Reihenfolge zu sperren. Ein Deadlock kann auch auftreten, wenn mehrere Transaktionen gleichzeitig dieselbe Ressource sperren.

Um dieses Problem zu lösen, implementiert das Datenbanksystem verschiedene Deadlock-Erkennungs- und Deadlock-Timeout-Mechanismen. Komplexere Systeme wie die InnoDB-Speicher-Engine sind besser in der Lage, zirkuläre Deadlock-Abhängigkeiten zu erkennen und sofort einen Fehler zurückzugeben. Diese Lösung ist sehr effektiv, da ein Deadlock andernfalls zu sehr langsamen Abfragen führt. Eine andere Lösung besteht darin, die Sperranforderung aufzugeben, wenn die Abfragezeit die Einstellung für das Sperrwartezeitlimit erreicht. Diese Methode ist im Allgemeinen nicht gut. Die aktuelle Methode von InnoDB zum Umgang mit Deadlocks besteht darin, die Transaktion mit der geringsten exklusiven Sperre auf Zeilenebene zurückzusetzen (dies ist ein relativ einfacher Deadlock-Rollback-Algorithmus).

Das Verhalten und die Reihenfolge von Sperren hängen mit der Speicher-Engine zusammen. Bei der Ausführung von Anweisungen in derselben Reihenfolge führen einige Speicher-Engines zu Deadlocks, andere jedoch nicht. Deadlocks treten aus zwei Gründen auf: Einige sind auf echte Datenkonflikte zurückzuführen, die oft schwer zu vermeiden sind, andere sind jedoch ausschließlich auf die Art und Weise zurückzuführen, wie die Speicher-Engine implementiert ist.

1.3.3 Transaktionsprotokoll

Wenn die Speicher-Engine mithilfe des Transaktionsprotokolls die Daten in der Tabelle ändert, muss sie nur ihre Speicherkopie ändern und dann die Änderung an der Transaktion aufzeichnen Protokoll, das auf der Festplatte gespeichert wird, anstatt jedes Mal die geänderten Daten selbst auf der Festplatte zu speichern. Das Transaktionsprotokoll wird angehängt. Nachdem das Transaktionsprotokoll beibehalten wurde, können die geänderten Daten im Speicher im Hintergrund langsam auf die Festplatte zurückgespült werden. Derzeit sind die meisten Speicher-Engines auf diese Weise implementiert, was wir normalerweise als Write-Ahead-Protokollierung (Write-Ahead-Protokollierung) bezeichnen. Das Ändern von Daten erfordert zweimaliges Schreiben auf die Festplatte.

Wenn die Datenänderung im Transaktionsprotokoll aufgezeichnet und beibehalten wurde, die Daten selbst jedoch nicht auf die Festplatte zurückgeschrieben wurden und das System abstürzt, kann die Speicher-Engine diese geänderten Daten beim Neustart automatisch wiederherstellen. Die spezifische Wiederherstellungsmethode hängt von der Speicher-Engine ab.

1.3.4 Transaktionen in MySQL

1.4 Multiversions-Parallelitätskontrolle

Die Implementierung von MVCC wird durch das Speichern einer Momentaufnahme der Daten zu einem bestimmten Zeitpunkt erreicht. Mit anderen Worten: Unabhängig davon, wie lange die Ausführung dauert, sind die von jeder Transaktion angezeigten Daten konsistent. Abhängig von der Zeit, zu der die Transaktion beginnt, können die Daten, die jede Transaktion zur gleichen Zeit in derselben Tabelle sieht, unterschiedlich sein. Im Folgenden veranschaulichen wir anhand einer vereinfachten Version des Verhaltens von InnoDB, wie MVCC funktioniert.

Der MVCC von InnoDB wird implementiert, indem zwei versteckte Spalten hinter jeder Datensatzzeile gespeichert werden. Von diesen beiden Spalten enthält eine die Erstellungszeit der Zeile und die andere die Ablaufzeit (oder Löschzeit) der Zeile. Gespeichert wird natürlich nicht der tatsächliche Zeitwert, sondern die Systemversionsnummer. Jedes Mal, wenn eine neue Transaktion gestartet wird, wird die Systemversionsnummer automatisch erhöht. Die Systemversionsnummer zu Beginn der Transaktion wird als Versionsnummer der Transaktion verwendet, die zum Vergleich mit der Versionsnummer jeder abgefragten Datensatzzeile verwendet wird. Werfen wir einen Blick darauf, wie MVCC speziell unter der Isolationsstufe REPEATABLE READ funktioniert.

SELECT

InnoDB prüft jede Zeile von Datensätzen basierend auf den folgenden zwei Bedingungen:

a. InnoDB sucht nur nach Datenzeilen, deren Version älter als die aktuelle Transaktionsversion ist (d. h. die Systemversionsnummer der Zeile ist kleiner oder gleich der Systemversionsnummer der Transaktion). Dadurch wird sichergestellt, dass die Zeilen von der Transaktion gelesen werden entweder bereits vor Beginn der Transaktion vorhanden oder durch die Transaktion selbst geändert.

b. Die gelöschte Version der Zeile ist entweder undefiniert oder größer als die aktuelle Transaktionsversionsnummer. Dadurch wird sichergestellt, dass die von der Transaktion gelesenen Zeilen nicht vor dem Start der Transaktion gelöscht wurden.

Nur ​​Datensätze, die die beiden oben genannten Bedingungen erfüllen, können als Abfrageergebnisse zurückgegeben werden.

INSERT

InnoDB speichert die aktuelle Systemversionsnummer als Zeilenversionsnummer für jede neu eingefügte Zeile.

DELETE

InnoDB speichert die aktuelle Systemversionsnummer als Zeilenlöschungskennung für jede gelöschte Zeile.

UPDATE

​​InnoDB fügt eine neue Zeile mit Datensätzen ein, speichert die aktuelle Systemversionsnummer als Zeilenversionsnummer und speichert die aktuelle Systemversionsnummer in der ursprünglichen Zeile als Zeilenlöschung Identifikator.

Speichern Sie diese beiden zusätzlichen Systemversionsnummern, damit die meisten Lesevorgänge ohne Sperren durchgeführt werden können. Dieses Design macht den Datenlesevorgang sehr einfach, die Leistung ist sehr gut und es stellt außerdem sicher, dass nur Zeilen gelesen werden, die den Standards entsprechen. Die Nachteile bestehen darin, dass jede Datensatzzeile zusätzlichen Speicherplatz, mehr Zeilenprüfung und einige zusätzliche Wartungsarbeiten erfordert.

MVCC funktioniert nur unter zwei Isolationsstufen: REPEATABLE READ und READ COMMITTED. Die anderen beiden Isolationsstufen sind nicht mit MVCC Note 4 kompatibel, da READ UNCOMMITTED immer die neueste Datenzeile liest, nicht die Datenzeile, die der aktuellen Transaktionsversion entspricht. SERIALIZABLE sperrt alle gelesenen Zeilen.

1.5 MySQL-Speicher-Engine

Im Dateisystem speichert MySQL jede Datenbank (auch Schema genannt) als Unterverzeichnis im Datenverzeichnis. Beim Erstellen einer Tabelle erstellt MySQL eine .frm-Datei mit demselben Namen wie die Tabelle im Datenbankunterverzeichnis, um die Tabellendefinition zu speichern. Wenn Sie beispielsweise eine Tabelle mit dem Namen MyTable erstellen, speichert MySQL die Definition der Tabelle in der Datei MyTable.frm. Da MySQL Dateisystemverzeichnisse und -dateien zum Speichern von Datenbank- und Tabellendefinitionen verwendet, hängt die Groß-/Kleinschreibung eng mit der jeweiligen Plattform zusammen. Unter Windows wird die Groß-/Kleinschreibung nicht beachtet; in Unix-ähnlichen Fällen wird die Groß-/Kleinschreibung beachtet. Verschiedene Speicher-Engines speichern Daten und Indizes auf unterschiedliche Weise, aber die Definition von Tabellen wird in der MySQL-Serviceschicht einheitlich gehandhabt.

Sie können den Befehl SHOW TABLE STATUS verwenden (in Versionen nach MySQL 5.0 können Sie auch die entsprechende Tabelle in INFORMATION SCHEMA abfragen), um tabellenbezogene Informationen anzuzeigen. Zum Beispiel für die Benutzertabelle in der MySQL-Datenbank:

mysql> SHOW TABLE STATUS LIKE 'user' G

Name: user

Engine: MyISAM

Zeilenformat: Dynamisch

Zeilen: 6

Durchschn._Zeilenlänge: 59

Datenlänge: 356

Maximale Datenlänge: 4294967295

Indexlänge: 2048

Datenfrei: 0

Automatische_Inkrementierung: NULL

Erstellungszeit: 24.01.2002 18:07:17

Aktualisierungszeit: 2002 - 01- 24 21: 56 : 29

Prüfzeit: NULL

Sortierung: ut f8_bin

Prüfsumme: NULL

Erstellungsoptionen:

Kommentar: Benutzer und globale Berechtigungen

1 Zeile im Satz (o.oo Sek.)

Die Ergebnisse zeigen, dass es sich um eine MyISAM-Tabelle handelt. Die Ausgabe enthält viele weitere Informationen sowie Statistiken. Nachfolgend finden Sie eine kurze Einführung in die Bedeutung jeder Zeile.

Name

Tabellenname.

Engine

Der Speicher-Engine-Typ der Tabelle. In älteren Versionen lautete der Name der Spalte „Typ“ und nicht „Engine“.

Zeilenformat

Zeilenformat. Für MyISAM-Tabellen sind die optionalen Werte Dynamic, Fixed oder Com ressed. Die Zeilenlänge von Dynamic ist variabel und enthält im Allgemeinen Felder variabler Länge, z. B. VARCHAR oder BLOB. Die feste Zeilenlänge ist fest und enthält nur Spalten fester Länge, wie z. B. CHAR und INTEGER. Komprimierte Zeilen gibt es nur in komprimierten Tabellen.

Zeilen

Die Anzahl der Zeilen in der Tabelle. Für MyISAM und einige andere Speicher-Engines ist der Wert präzise, ​​für InnoDB handelt es sich jedoch um eine Schätzung.

Avg_ row_length

Die durchschnittliche Anzahl von Bytes pro Zeile.

Datenlänge

Die Größe der Tabellendaten in Bytes.

Max- data_length

Die maximale Kapazität der Tabellendaten. Dieser Wert bezieht sich auf die Speicher-Engine.

Indexlänge

Die Größe des Index in Bytes.

Data_free

Stellt bei MyISAM-Tabellen zugewiesenen, aber derzeit ungenutzten Speicherplatz dar. Dieser Teil des Speicherplatzes umfasst zuvor gelöschte Zeilen und den Speicherplatz, der später von INSERT verwendet werden kann.

Auto_increment

Der Wert des nächsten AUTO INCREMENT.

Create_time

Die Erstellungszeit der Tabelle.

Update_time

Der letzte Änderungszeitpunkt der Tabellendaten.

Check_ time

Der Zeitpunkt, zu dem die Tabelle zuletzt mit dem Befehl CKECK TABLE oder dem Tool myisamchk überprüft wurde.

Sortierung

Der Standardzeichensatz und die Zeichenspaltensortierung für die Tabelle.

Prüfsumme

Wenn aktiviert, wird eine Echtzeit-Prüfsumme der gesamten Tabelle gespeichert.

Create_options

Andere Optionen, die beim Erstellen der Tabelle angegeben wurden.

Kommentar

Diese Spalte enthält einige zusätzliche Informationen. Bei MyISAM-Tabellen werden die Kommentare gespeichert, die beim Erstellen der Tabelle eingefügt wurden. Bei InnoDB-Tabellen werden die verbleibenden Speicherplatzinformationen des InnoDB-Tabellenbereichs gespeichert. Wenn es sich um eine Ansicht handelt, enthält diese Spalte das Textwort „VIEW“.

1.6 MySQL-Zeitleiste

1.7 MySQL-Entwicklungsmodell

Referenz: „Hochleistungs-MySQL“

Das obige ist der detaillierte Inhalt vonMySQL-Architektur. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn