Dieser Artikel vermittelt Ihnen relevantes Wissen über MySQL. Er fasst hauptsächlich einige häufig auftretende Probleme zusammen, einschließlich herkömmlicher Probleme, sowie verwandte Inhalte zu Indexklassen, Hauptklassen und Framework-Klassen. Jeder ist hilfsbereit.
Empfohlenes Lernen: MySQL-Video-Tutorial
Regelmäßiger Teil
1. Sprechen Sie über die drei Hauptparadigmen von Datenbanken?
Erste Normalform: Feldatomarität, zweite Normalform: Zeilen sind eindeutig und haben Primärschlüsselspalten, dritte Normalform: Jede Spalte steht in Beziehung zur Primärschlüsselspalte.
In tatsächlichen Anwendungen wird eine kleine Anzahl redundanter Felder verwendet, um die Anzahl verwandter Tabellen zu reduzieren und die Abfrageeffizienz zu verbessern.
2. Es wird nur ein Datenelement abgefragt, aber die Ausführung ist sehr langsam. Was sind die häufigsten Gründe?
- Die MySQL-Datenbank selbst ist blockiert, zum Beispiel: unzureichende System- oder Netzwerkressourcen
- SQL-Anweisungen werden blockiert, wie zum Beispiel: Tabellensperren, Zeilensperren usw., was dazu führt, dass die Speicher-Engine die entsprechenden SQL-Anweisungen nicht ausführt
- Es ist zwar eine unsachgemäße Verwendung von Indizes, keine Indizierung, aber die Anzahl der Tabellenrückgaben ist enorm. 3. Unterschiede in der Implementierungsmethode von count(*), count (0) und count(id) ?
-
Für Zählfunktionen in Form von
count(*)
,
count(constant)
,
count(primary key)
, dem Optimierer Sie können den Index mit den geringsten Scankosten auswählen, um die Effizienz zu verbessern. Ihre Ausführungsprozesse sind gleich.
Für count (non-index columns)
wählt der Optimierer einen vollständigen Tabellenscan, was bedeutet, dass er nur die Blattknoten des Clustered-Index nacheinander scannen kann.
count (sekundäre Indexspalte)
kann nur den Index auswählen, der die Spalten enthält, die wir zum Ausführen der Abfrage angeben, was dazu führen kann, dass die vom Optimierer ausgewählten Indexausführungskosten nicht die kleinsten sind.
-
count(*)
、count(常数)
、count(主键)
形式的count函数来说,优化器可以选择扫描成本最小的索引执行查询,从而提升效率,它们的执行过程是一样的。
- 而对于
count(非索引列)
来说,优化器选择全表扫描,说明只能在聚集索引的叶子结点顺序扫描。
count(二级索引列)
4. Was soll ich tun, wenn ich versehentlich Daten lösche?
1) Wenn die Datenmenge relativ groß ist, verwenden Sie das physische Backup xtrabackup. Führen Sie regelmäßig vollständige Sicherungen der Datenbank sowie inkrementelle Sicherungen durch.
2) Wenn die Datenmenge gering ist, verwenden Sie mysqldump oder mysqldumper und verwenden Sie dann binlog, um die Daten wiederherzustellen, oder richten Sie eine Master-Slave-Methode ein, um die Daten wiederherzustellen. Sie können die Daten wie folgt wiederherstellen:
- DML-Fehlbedienungsanweisung: Sie können Flashback verwenden, um zuerst das Binlog-Ereignis zu analysieren und es dann umzukehren.
- Fehlbedienung der DDL-Anweisung: Daten können nur durch vollständige Sicherung + Anwendung von Binlog wiederhergestellt werden. Sobald die Datenmenge relativ groß ist, ist die Wiederherstellungszeit besonders lang.
- RM-Löschung: Verwenden Sie Backups, um computerraumübergreifend oder vorzugsweise stadtübergreifend zu speichern.
5. Der Unterschied zwischen Löschen, Abschneiden und Löschen
- Der Löschvorgang durch die DELETE-Anweisung besteht darin, jeweils eine Zeile aus der Tabelle zu löschen, und gleichzeitig erfolgt der Löschvorgang der Zeile Wird im Protokoll als Transaktionsdatensatz zur weiteren Verarbeitung gespeichert.
- TRUNCATE TABLE löscht alle Daten auf einmal aus der Tabelle und zeichnet einzelne Löschvorgangsdatensätze nicht im Protokoll auf. Gelöschte Zeilen können nicht wiederhergestellt werden. Und der mit der Tabelle verbundene Löschauslöser wird während des Löschvorgangs nicht aktiviert und die Ausführungsgeschwindigkeit ist hoch.
- Die Drop-Anweisung gibt den gesamten von der Tabelle belegten Platz frei.
6. Warum führt die Abfrage großer MySQL-Tabellen nicht zum Platzen des Speichers?
- MySQL sendet beim Lesen, was bedeutet, dass der MySQL-Server die Ergebnisse nicht senden kann und die Transaktionsausführungszeit länger wird, wenn der Client langsam empfängt.
- Der Server muss keinen vollständigen Ergebnissatz speichern. Die Prozesse zum Abrufen und Senden von Daten werden alle über einen next_buffer abgewickelt.
- Speicherdatenseiten werden im Buffer Pool (BP) verwaltet.
- InnoDB verwaltet den Pufferpool mithilfe eines verbesserten LRU-Algorithmus, der mithilfe einer verknüpften Liste implementiert wird. Bei der InnoDB-Implementierung wird die gesamte verknüpfte LRU-Liste im Verhältnis 5:3 in junge Bereiche und alte Bereiche unterteilt, um sicherzustellen, dass heiße Daten nicht weggespült werden, wenn kalte Daten in großen Mengen geladen werden.
7. Wie gehe ich mit Deep Paging um (extrem großes Paging)?
- Verwenden Sie die ID-Optimierung: Suchen Sie zuerst die maximale ID des letzten Pagings und verwenden Sie dann den Index für die ID zur Abfrage, ähnlich wie bei der Auswahl * vom Benutzer mit der ID> 1000000.
- Mit abdeckendem Index optimieren: Wenn eine MySQL-Abfrage den Index vollständig erreicht, wird sie als abdeckender Index bezeichnet. Dies ist sehr schnell, da die Abfrage nur den Index durchsuchen muss und dann direkt zurückkehren kann, ohne zur Tabelle zurückzukehren Um die Daten zu erhalten, können wir zuerst die ID des Index ermitteln und dann die Daten basierend auf der ID abrufen.
- Begrenzen Sie die Anzahl der Seiten, wenn es das Geschäft zulässt
8. Wie optimiert man SQL in der täglichen Entwicklung?
- Geeignete Indizes hinzufügen: Erstellen Sie einen Index für die Felder, die als Abfragebedingungen verwendet werden, und sortieren Sie nach, berücksichtigen Sie mehrere Abfragefelder, um einen kombinierten Index zu erstellen, achten Sie auf die Reihenfolge der kombinierten Indexfelder und platzieren Sie die am häufigsten verwendeten Spalten als Randbedingungen am Ende. Auf der linken Seite sollten die Indizes in absteigender Reihenfolge nicht zu viele sein, im Allgemeinen innerhalb von 5.
- Tabellenstruktur optimieren: Numerische Felder sind besser als Zeichenfolgentypen, kleinere Datentypen sind normalerweise besser. Versuchen Sie, NOT NULL zu verwenden.
- Abfrageanweisungen optimieren: Analysieren Sie den SQL-Ausführungsplan, ob er auf den Index trifft usw. Wenn die SQL sehr gut ist komplex, optimieren Sie die SQL-Struktur. Wenn die Datenmenge in der Tabelle zu groß ist, sollten Sie eine Aufteilung der Tabelle in Betracht ziehen
9. Was ist der Unterschied zwischen gleichzeitigen Verbindungen und gleichzeitigen Abfragen in MySQL?
- Im Ergebnis der Ausführung von show Processlist habe ich Tausende von Verbindungen gesehen, was sich auf gleichzeitige Verbindungen bezieht.
- Die Anweisung „aktuell ausgeführt“ ist eine gleichzeitige Abfrage.
- Eine große Anzahl gleichzeitiger Verbindungen beeinträchtigt den Speicher.
- Zu hohe gleichzeitige Abfragen sind schlecht für die CPU. Eine Maschine verfügt über eine begrenzte Anzahl von CPU-Kernen und wenn alle Threads in Eile sind, sind die Kosten für den Kontextwechsel zu hoch.
- Es ist zu beachten, dass die Anzahl der gleichzeitigen Threads um eins reduziert wird, nachdem ein Thread in die Sperrwartezeit eintritt, sodass Threads, die auf Zeilensperren oder Lückensperren warten, nicht im Zählbereich enthalten sind. Das heißt, der Thread, der auf die Sperre wartet, beansprucht nicht die CPU und verhindert so, dass das gesamte System blockiert.
10. Wie aktualisiert MySQL den Feldwert auf den ursprünglichen Wert?
- Für dieselben Daten wird keine Aktualisierung durchgeführt.
- Verschiedene Binlog-Formate verfügen jedoch über unterschiedliche Protokollverarbeitungsmethoden:
- 1) Im Zeilenmodus gleicht die Serverschicht den zu aktualisierenden Datensatz ab und stellt fest, dass der neue Wert mit dem alten Wert übereinstimmt. Er kehrt direkt zurück, ohne ihn zu aktualisieren . , Binlog wird auch nicht aufgezeichnet.
- 2) Wenn MySQL auf einer Anweisung oder einem gemischten Format basiert, führt es die Update-Anweisung aus und zeichnet die Update-Anweisung im Binlog auf.
11. Was ist der Unterschied zwischen Datum/Uhrzeit und Zeitstempel?
- Der Datumsbereich von datetime ist 1001-9999; der Zeitbereich von timestamp ist 1970-2038
- datetime-Speicherzeit hat nichts mit der Zeitzone zu tun; die Zeitstempel-Speicherzeit hängt auch von der Zeitzone ab Hängt von der Zeitzone ab
- Der Speicherplatz von datetime beträgt 8 Bytes; der Speicherplatz von timestamp beträgt 4 Bytes
- Der Standardwert von datetime ist standardmäßig nicht leer (nicht null), und der Der Standardwert ist die aktuelle Zeit (current_timestamp)
12. Was sind die Isolationsstufen von Transaktionen?
- „Read Uncommitted“ ist die niedrigste Stufe und kann unter keinen Umständen garantiert werden.
- „Read Committed“ kann das Auftreten von Dirty Reads vermeiden.
- „Repeatable Read“ kann das Auftreten von Dirty Reads und Non-Read vermeiden. Wiederholbare Lesevorgänge
- „Serialisierbar“ kann das Auftreten von Dirty Reads, nicht wiederholbaren Lesevorgängen und Phantom-Lesevorgängen vermeiden
- Die Standard-Transaktionsisolationsstufe von MySQL ist „Wiederholbare Lesevorgänge“
13. In MySQL gibt es zwei Kill-Befehle
- Kill-Abfrage + Thread-ID, was bedeutet, dass die in diesem Thread ausgeführte Anweisung beendet wird.
- Kill-Verbindung + Thread-ID, wobei die Verbindung als Standardwert angegeben werden kann, was eine Trennung anzeigt. Die Verbindung dieses Threads
Indexkapitel
1. Was sind die Indexkategorien?
- Entsprechend dem Inhalt des Blattknotens wird der Indextyp in Primärschlüsselindex und Nicht-Primärschlüsselindex unterteilt.
- Die Blattknoten des Primärschlüsselindex speichern die gesamte Datenzeile. In InnoDB wird der Primärschlüsselindex auch als Clustered-Index bezeichnet.
- Der Inhalt von Blattknoten in Nicht-Primärschlüsselindizes ist der Wert des Primärschlüssels. In InnoDB werden Nicht-Primärschlüsselindizes auch Sekundärindizes genannt.
2. Was ist der Unterschied zwischen Clustered-Index und Nicht-Clustered-Index?
-
Clustered-Index: Ein Clustered-Index ist ein Index, der mit dem Primärschlüssel erstellt wird. Der Clustered-Index speichert die Daten in der Tabelle in den Blattknoten.
-
Nicht gruppierter Index: Ein durch einen Nicht-Primärschlüssel erstellter Index speichert den Primärschlüssel und die Indexspalte im Blattknoten. Wenn Sie den nicht gruppierten Index zum Abfragen der Daten verwenden, können Sie den Primärschlüssel abrufen Geben Sie die Taste auf dem Blatt ein und finden Sie dann die gewünschten Daten. (Der Vorgang, den Primärschlüssel abzurufen und dann danach zu suchen, wird als Tabellenrückgabe bezeichnet.)
Abdeckender Index: Angenommen, die abgefragten Spalten sind zufällig die Spalten, die dem Index entsprechen, und es besteht keine Notwendigkeit, zur Tabelle zurückzukehren, um nachzuschlagen, dann wird diese Indexspalte als abdeckender Index bezeichnet .
3. Warum entwirft InnoDB einen B+-Baum anstelle von B-Baum, Hash, Binärbaum und Rot-Schwarz-Baum?
- Der Hash-Index kann das Hinzufügen, Löschen, Ändern und Abfragen einer einzelnen Datenzeile mit O(1)-Geschwindigkeit verarbeiten, führt jedoch bei Bereichsabfragen oder Sortierungen zu den Ergebnissen eines vollständigen Tabellenscans.
- B-Tree kann Daten in Nicht-Blattknoten speichern. Da alle Knoten Zieldaten enthalten können, müssen wir den Teilbaum immer vom Wurzelknoten nach unten durchlaufen, um Datenzeilen zu finden, die die Bedingungen erfüllen Zufällige E/A, was zu Leistungseinbußen führt.
- Alle Datenzeilen des B+-Baums werden in Blattknoten gespeichert, und diese Blattknoten können der Reihe nach über „Zeiger“ verbunden werden. Wenn wir die Daten im B+-Baum wie unten gezeigt durchlaufen, können wir direkt zwischen mehreren untergeordneten Knoten fortfahren . Jump, was viel Festplatten-E/A-Zeit sparen kann.
Binärbaum: Die Höhe des Baums ist ungleichmäßig und kann nicht selbst ausgeglichen werden. Die Sucheffizienz hängt von den Daten (der Höhe des Baums) ab und die IO-Kosten sind hoch.
Rot-Schwarz-Baum: Die Höhe des Baums nimmt mit zunehmender Datenmenge zu und die E/A-Kosten sind hoch.
4. Reden wir über Clustered-Index und Non-Clustered-Index?
- In InnoDB speichert der Blattknoten des Index B+ Tree die gesamte Datenzeile mithilfe des Primärschlüsselindex, auch Clustered-Index genannt, der den Datenspeicher und den Index zusammenfügt Finden Sie die Daten.
- Die Blattknoten des Index B+Tree speichern den Wert des Primärschlüssels, bei dem es sich um einen Nicht-Primärschlüsselindex handelt, der auch als nicht gruppierter Index oder Sekundärindex bezeichnet wird.
-
Der erste Index ist normalerweise eine sequentielle E/A, und der Vorgang der Rückkehr zur Tabelle ist eine zufällige E/A. Je öfter wir zur Tabelle zurückkehren müssen, das heißt, je öfter wir zufällige E/A benötigen, desto häufiger verwenden wir den vollständigen Tabellenscan.
5. Wird der nicht gruppierte Index die Tabellenabfrage definitiv zurückgeben?
- Dabei geht es nicht unbedingt darum, ob alle von der Abfrageanweisung benötigten Felder auf den Index treffen. Wenn alle Felder auf den Index treffen, besteht keine Notwendigkeit, eine Rückabfrage an die Tabelle durchzuführen. Ein Index enthält (deckt) die Werte aller Felder ab, die abgefragt werden müssen, und wird als „Abdeckungsindex“ bezeichnet.
6. Erzählen Sie mir etwas über das Prinzip des ganz linken Präfixes von MySQL?
- Das Präfixprinzip ganz links hat Priorität. Bei der Erstellung eines mehrspaltigen Index wird die am häufigsten verwendete Spalte in der where-Klausel ganz links platziert.
- MySQL führt den Abgleich nach rechts fort, bis eine Bereichsabfrage (>, <, between, like) auftritt, und stoppt dann den Abgleich, z. B. a = 1 und b = 2 und c > 3 und d = 4 . Wenn (a, Indizes in der Reihenfolge von b, c, d), d nicht für die Indizierung verwendet wird. Wenn Sie einen Index von (a, b, d, c) erstellen, kann er verwendet werden. b, d können beliebig angepasst werden.
- = und in können nicht in der richtigen Reihenfolge sein, z. B. a = 1 und b = 2 und c = 3. Der Index (a, b, c) kann in beliebiger Reihenfolge erstellt werden. Der Abfrageoptimierer von MySQL hilft Ihnen bei der Optimierung eine Form, die der Index erkennen kann.
7. Was ist Index-Pushdown?
- Wenn das Prinzip des Präfixes ganz links erfüllt ist, kann das Präfix ganz links zum Suchen von Datensätzen im Index verwendet werden.
- Vor MySQL 5.6 konnten Sie Tabellen nur einzeln, beginnend mit der ID, zurückgeben. Suchen Sie die Datenzeile im Primärschlüsselindex und vergleichen Sie dann die Feldwerte.
- Die in MySQL 5.6 eingeführte Index-Pushdown-Optimierung (Index Condition Pushdown) kann zunächst die im Index enthaltenen Felder während des Indexdurchlaufprozesses beurteilen, Datensätze, die die Bedingungen nicht erfüllen, direkt herausfiltern und die Anzahl der Tabellenrückgaben reduzieren.
8. Warum verwendet Innodb die automatisch inkrementierende ID als Primärschlüssel?
- Wenn die Tabelle einen automatisch inkrementierenden Primärschlüssel verwendet, werden die Datensätze jedes Mal, wenn ein neuer Datensatz eingefügt wird, nacheinander an der nachfolgenden Position des aktuellen Indexknotens hinzugefügt. Wenn eine Seite voll ist, wird eine neue Seite hinzugefügt automatisch geöffnet werden. Wenn Sie einen nicht automatisch ansteigenden Primärschlüssel verwenden (z. B. ID-Nummer oder Studentennummer usw.), muss jeder neue Datensatz irgendwo in der Mitte eingefügt werden, da der Wert des jedes Mal eingefügten Primärschlüssels ungefähr zufällig ist Die vorhandene Indexseite verursachte häufig eine starke Fragmentierung und führte zu einer nicht kompakten Indexstruktur. Anschließend musste OPTIMIZE TABLE (Tabelle optimieren) verwendet werden, um die Tabelle neu aufzubauen und die gefüllten Seiten zu optimieren.
9. Wie wird die Transaktions-ACID-Funktion implementiert?
- „Atomizität“: Wird mithilfe des Rückgängig-Protokolls implementiert. Wenn während der Transaktionsausführung ein Fehler auftritt oder der Benutzer ein Rollback ausführt, gibt das System den Status des Transaktionsstarts über das Rückgängig-Protokoll zurück.
- „Persistenz“: Verwenden Sie dazu das Redo-Protokoll. Solange das Redo-Protokoll bestehen bleibt, können die Daten bei einem Systemabsturz über das Redo-Protokoll wiederhergestellt werden.
- „Isolation“: Verwenden Sie Sperren und MVCC, um Transaktionen voneinander zu isolieren.
- „Konsistenz“: Konsistenz wird durch Rollback, Wiederherstellung und Isolierung in gleichzeitigen Situationen erreicht.
10. Was ist der Unterschied zwischen der Art und Weise, wie MyISAM und InnoDB den B-Tree-Index implementieren?
11. Welche Kategorien von Indizes gibt es?
- Je nach Inhalt der Blattknoten wird der Indextyp in Primärschlüsselindex und Nicht-Primärschlüsselindex unterteilt.
- Der Blattknoten des Primärschlüsselindex speichert die gesamte Datenzeile. In InnoDB wird der Primärschlüsselindex auch Clustered-Index genannt.
- Der Inhalt von Blattknoten in Nicht-Primärschlüsselindizes ist der Wert des Primärschlüssels. In InnoDB werden Nicht-Primärschlüsselindizes auch Sekundärindizes genannt.
12. Welche Szenarien führen zu einem Indexausfall?
Hintergrund: Die vom B+-Baum bereitgestellte Fähigkeit zur schnellen Positionierung beruht auf der Ordnung der Geschwisterknoten auf derselben Ebene. Wenn diese Ordnung zerstört wird, wird sie daher höchstwahrscheinlich wie folgt fehlschlagen:
Verwenden Sie den linken oder linken Fuzzy-Matching für den Index: das heißt, wie %xx oder wie %xx%. Beide Methoden führen zu einem Indexfehler. Der Grund dafür ist, dass die Abfrageergebnisse möglicherweise „Chen Lin, Zhang Lin, Zhou Lin“ usw. lauten. Daher wissen wir nicht, mit welchem Indexwert wir den Vergleich beginnen sollen, und können daher nur über einen vollständigen Tabellenscan abfragen.
Funktionen für Indizes verwenden/Ausdrücke für Indizes berechnen: Da der Index den ursprünglichen Wert des Indexfelds speichert, nicht den von der Funktion berechneten Wert, gibt es natürlich keine Möglichkeit, den Index zu verwenden.
Implizite Typkonvertierung für den Index: entspricht der Verwendung einer neuen Funktion
Die Bedeutung von OR in der WHERE-Klausel besteht darin, dass nur eine der beiden Bedingungen erfüllt ist. Daher ist es bedeutungslos, dass nur eine bedingte Spalte eine ist Indexspalte Ja, solange die bedingte Spalte keine Indexspalte ist, wird ein vollständiger Tabellenscan durchgeführt.
Vorschlag
1. Es gibt ein System, das nicht in Datenbanken und Tabellen unterteilt ist, damit das System dynamisch auf Datenbanken und Tabellen umschalten kann.
- Erweiterung stoppen (nicht empfohlen)
- Double-Write-Migrationsplan: Entwerfen Sie den erweiterten Tabellenstrukturplan und implementieren Sie dann Dual-Write für die einzelne Datenbank und die Unterdatenbank, nachdem Sie eine Woche lang beobachtet haben, dass es keine Probleme gibt Beobachten Sie den Leseverkehr der einzelnen Datenbank für eine Weile, schließen Sie den Schreibverkehr der einzelnen Datenbank und wechseln Sie reibungslos zur Unterdatenbank.
2. Wie entwerfe ich ein Unterdatenbank- und Tabellenschema, das die Kapazität dynamisch erweitern und verkleinern kann?
Grundsätze
1. Was sind die Schritte zum Ausführen einer MySQL-Anweisung?
- Die Schritte für die Serverschicht zum Ausführen von SQL sind:
- Client-Anfrage –> Connector (Benutzeridentität überprüfen, Berechtigungen erteilen) –> vorhanden) - > Analysator (lexikalische Analyse und Syntaxanalyse von SQL) -> , nur dann können Sie die von dieser Engine bereitgestellte Schnittstelle verwenden) -> Gehen Sie zur Engine-Ebene, um Datenrückgaben zu erhalten (wenn das Abfrage-Caching aktiviert ist, werden die Abfrageergebnisse zwischengespeichert).
2. Was ist das interne Prinzip der Ordnung durch Sortieren?
- MySQL weist jedem Thread einen Speicher (sort_buffer) zum Sortieren zu. Die Speichergröße ist sort_buffer_size.
- Wenn die zu sortierende Datenmenge kleiner als sort_buffer_size ist, wird die Sortierung im Speicher abgeschlossen.
- Wenn die Menge der sortierten Daten groß ist und nicht im Speicher gespeichert werden kann, werden temporäre Dateien auf der Festplatte zur Unterstützung der Sortierung verwendet, die auch als externe Sortierung bezeichnet wird.
- Bei Verwendung der externen Sortierung wird MySQL in mehrere separate temporäre Dateien aufgeteilt, um die sortierten Daten zu speichern, und diese Dateien dann zu einer großen Datei zusammenführen.
3. MVCC-Implementierungsprinzip?
- MVCC (Multiversion Concurrency Control) ist eine Möglichkeit, mehrere Versionen derselben Daten beizubehalten und so eine Parallelitätskontrolle zu erreichen. Suchen Sie beim Abfragen die Daten der entsprechenden Version über die Leseansicht und die Versionskette.
- Funktion: Verbessern Sie die Parallelitätsleistung. Für Szenarien mit hoher Parallelität ist MVCC kostengünstiger als Sperren auf Zeilenebene.
- Die Implementierung von MVCC basiert auf der Versionskette, die über drei versteckte Felder der Tabelle implementiert wird.
- 1) DB_TRX_ID: Aktuelle Transaktions-ID. Die zeitliche Abfolge der Transaktion wird anhand der Größe der Transaktions-ID beurteilt.
- 2) DB_ROLL_PRT: Der Rollback-Zeiger zeigt auf die vorherige Version des aktuellen Zeilendatensatzes. Durch diesen Zeiger werden mehrere Versionen der Daten miteinander verbunden, um eine Undo-Log-Versionskette zu bilden.
- 3) DB_ROLL_ID: Primärschlüssel. Wenn die Datentabelle keinen Primärschlüssel hat, generiert InnoDB automatisch einen Primärschlüssel.
4. Was ist ein Änderungspuffer und welche Funktion hat er?
5. Wie stellt MySQL sicher, dass keine Daten verloren gehen?
- Solange Redolog und Binlog persistente Festplatten gewährleisten, kann der Binlog-Schreibmechanismus die Datenwiederherstellung nach einem abnormalen MySQL-Neustart sicherstellen.
- redolog stellt sicher, dass verlorene Daten nach einer Systemausnahme wiederhergestellt werden können, und binlog archiviert Daten, um sicherzustellen, dass verlorene Daten wiederhergestellt werden können.
- Redolog vor der Transaktionsausführung schreiben. Beim Senden der Transaktion wird das Protokoll zunächst in die binlog-Datei geschrieben.
6. Warum bleibt die Größe der Tabellendatei auch nach dem Löschen der Tabelle unverändert?
- Nach dem Löschen des Datenelements markiert InnoDB Seite A als wiederverwendbar.
- Was ist mit dem Löschbefehl zum Löschen der gesamten Tabellendaten? Dadurch werden alle Datenseiten als wiederverwendbar markiert. Aber auf der Festplatte wird die Datei nicht kleiner.
- Tabellen, die einer großen Anzahl von Hinzufügungen, Löschungen und Änderungen unterzogen wurden, können Lücken aufweisen. Diese Löcher nehmen auch Platz ein. Wenn diese Löcher also entfernt werden können, kann der Zweck der Verkleinerung des Tischraums erreicht werden.
- Der Wiederaufbau des Tisches kann diesen Zweck erreichen. Sie können den Befehl alter table A engine=InnoDB verwenden, um die Tabelle neu zu erstellen.
7. Vergleich der drei Binlog-Formate
- Das Binlog im Zeilenformat zeichnet die Primärschlüssel-ID der Operationszeile und den tatsächlichen Wert jedes Felds auf, sodass es keine Inkonsistenz in den Primär- und Backup-Operationsdaten gibt.
- Anweisung: Die aufgezeichnete Quell-SQL-Anweisung
- gemischt: Die ersten beiden sind gemischt. Warum benötigen Sie eine Datei mit gemischtem Format? Da einige Binlog-Anweisungsformate zu Inkonsistenzen zwischen Primär- und Sicherungsdatei führen können, wird das Zeilenformat verwendet. Der Nachteil des Zeilenformats besteht jedoch darin, dass es viel Platz beansprucht. MySQL ist einen Kompromiss eingegangen. MySQL selbst bestimmt, ob diese SQL-Anweisung zu Inkonsistenzen zwischen dem primären und sekundären Server führen kann. Wenn möglich, wird das Zeilenformat verwendet, andernfalls wird das Anweisungsformat verwendet. 8. MySQL-Sperrregeln
Prinzip 2: Nur die Objekte, auf die während des Suchvorgangs zugegriffen wird, werden gesperrt
Optimierung 1: Bei äquivalenten Abfragen im Index degeneriert die Next-Key-Sperre beim Sperren des eindeutigen Index in eine Zeilensperre.Optimierung 2: Bei äquivalenten Abfragen für den Index degeneriert die Next-Key-Sperre in eine Lückensperre, wenn nach rechts gelaufen wird und der letzte Wert die Äquivalenzbedingung nicht erfüllt.
Ein Fehler: eine Bereichsabfrage für ein Unique Der Index greift auf den ersten Wert zu, der die Bedingung nicht erfüllt.
9. Was sind Dirty Reads, Non-Repeatable Reads und Phantom Reads?
- „Dirty Reading“: Unter Dirty Reading versteht man das Lesen nicht festgeschriebener Daten aus anderen Transaktionen. Dies bedeutet, dass die Daten möglicherweise zurückgesetzt werden, was bedeutet, dass sie am Ende möglicherweise nicht in der Datenbank gespeichert werden keine Daten vorhanden. Das Lesen von Daten, die möglicherweise nicht mehr vorhanden sind, wird als Dirty Reading bezeichnet.
- „Nicht wiederholbares Lesen“: Nicht wiederholbares Lesen bezieht sich auf die Situation, in der innerhalb einer Transaktion die zu Beginn gelesenen Daten nicht mit demselben Datenstapel übereinstimmen, der zu irgendeinem Zeitpunkt vor dem Ende der Transaktion gelesen wurde.
- „Phantom-Lesung“: Phantom-Lesung bedeutet nicht, dass die durch zwei Lesevorgänge erhaltenen Ergebnismengen unterschiedlich sind. Der Schwerpunkt der Phantom-Lesung liegt darin, dass der Datenstatus des durch eine bestimmte Auswahloperation erhaltenen Ergebnisses nachfolgende Geschäftsoperationen nicht unterstützen kann. Genauer gesagt: Wählen Sie aus, ob ein bestimmter Datensatz vorhanden ist, und bereiten Sie das Einfügen des Datensatzes vor. Bei der Ausführung wird jedoch festgestellt, dass der Datensatz bereits vorhanden ist und nicht eingefügt werden kann auftritt.
10. Welche Art von Sperren hat MySQL? Würden Sperren wie die oben genannten nicht die Effizienz der Parallelität beeinträchtigen?
Framework
1. Was ist das Prinzip der MySQL-Master-Slave-Replikation?
- Master-Update-Ereignisse (Aktualisieren, Einfügen, Löschen) werden der Reihe nach in
bin-log
geschrieben. Wenn der Slave mit dem Master verbunden ist, öffnet der Master-Computer den Thread binlog dump
für den Slave und der Thread liest das Bin-Log-Protokoll. bin-log
中。当Slave连接到Master的后,Master机器会为Slave开启binlog dump
线程,该线程会去读取bin-log日志。
- Slave连接到Master后,Slave库有一个
I/O线程
通过请求binlog dump thread读取bin-log日志,然后写入从库的relay log
日志中。
- Slave还有一个
SQL线程
Nachdem der Slave mit dem Master verbunden ist, verfügt die Slave-Bibliothek über einen E/A-Thread
, der das Bin-Log-Protokoll liest, indem er den Binlog-Dump-Thread anfordert, und es dann in den relay log im Protokoll.
Slave verfügt außerdem über einen SQL-Thread
, der den Protokollinhalt des Relay-Logs in Echtzeit auf Aktualisierungen überwacht, die SQL-Anweisungen in der Datei analysiert und sie in der Slave-Datenbank ausführt.
2. Was sind die Master-Slave-Replikationssynchronisationsmethoden von MySQL?
- Asynchrone Replikation: Die MySQL-Master-Slave-Synchronisierung wird standardmäßig asynchron repliziert. Das heißt, von den oben genannten drei Schritten ist nur der erste Schritt synchron (dh Mater schreibt das Bin-Log-Protokoll), das heißt, die Master-Bibliothek kann nach dem Schreiben des Binlog-Protokolls erfolgreich zum Client zurückkehren, ohne auf das Binlog warten zu müssen Protokoll, das an die Slave-Bibliothek übertragen werden soll.
- Synchronische Replikation: Bei der synchronen Replikation wird, nachdem der Master-Host das Ereignis an den Slave-Host gesendet hat, eine Wartezeit ausgelöst, bis alle Slave-Knoten (wenn mehrere Slaves vorhanden sind) Informationen über die erfolgreiche Datenreplikation an den Master zurücksenden. Halbsynchrone Replikation:
Bei der halbsynchronen Replikation wird, nachdem der Master-Host das Ereignis an den Slave-Host gesendet hat, eine Wartezeit ausgelöst,
bis einer der Slave-Knoten (wenn mehrere Slaves vorhanden sind) Informationen zurückgibt über die erfolgreiche Datenreplikation zum Master.
3. Was verursacht die MySQL-Master-Slave-Synchronisierungsverzögerung?
- Wenn der Masterknoten eine große Transaktion ausführt, hat dies einen größeren Einfluss auf die Master-Slave-Verzögerung
- Netzwerkverzögerung, große Protokolle, zu viele Slaves
- Mehrere Threads auf dem Master Schreiben, Der Slave-Knoten verfügt nur über eine Single-Thread-Synchronisation
- Probleme mit der Maschinenleistung, ob der Slave-Knoten eine „schlechte Maschine“ verwendet🎜🎜Sperrkonfliktprobleme können auch dazu führen, dass der SQL-Thread des Slaves langsam ausgeführt wird🎜
4. Was verursacht die MySQL-Master-Slave-Synchronisierungsverzögerung?
- Große Transaktionen: Teilen Sie große Transaktionen in kleine Transaktionen auf und aktualisieren Sie Daten in Stapeln.
- Reduzieren Sie die Anzahl der Slaves auf nicht mehr als 5 und reduzieren Sie die Größe einer einzelnen Transaktion.
- Nach MySQL 5.7 können Sie Multithreading verwenden Replikation, verwenden Sie die MGR-Replikationsarchitektur
- Wenn es Probleme mit der Festplatte, der RAID-Karte oder der Planungsstrategie gibt, kann eine einzelne E/A-Verzögerung sehr hoch sein. Sie können den Befehl iostat verwenden, um die E/A-Situation der DB-Datenfestplatte zu überprüfen Treffen Sie dann weitere Urteile
- Bei Sperrproblemen können Sie die Grab-Prozessliste übergeben und die Tabellen im Zusammenhang mit Sperren und Transaktionen unter information_schema überprüfen.
6. Was sind Bin-Log/Redo-Log/Undo-Log?
- bin log ist eine Datei auf MySQL-Datenbankebene. Es zeichnet alle Vorgänge auf, die die MySQL-Datenbank ändern. Select- und Show-Anweisungen werden nicht aufgezeichnet.
- Die zu aktualisierenden Daten werden im Redo-Log aufgezeichnet. Wenn beispielsweise ein Datenelement erfolgreich übermittelt wird, wird es nicht sofort mit der Festplatte synchronisiert, sondern erst im Redo-Log Warten Sie den richtigen Zeitpunkt ab, bevor Sie die Festplatte leeren, um die Haltbarkeit des Transaktionsgeschlechts zu gewährleisten.
- Undo-Protokoll wird für Datenabrufvorgänge verwendet. Es behält den Inhalt bei, bevor der Datensatz geändert wird. Ein Transaktions-Rollback kann durch das Rückgängig-Protokoll erreicht werden, und MVCC kann implementiert werden, indem auf der Grundlage des Rückgängig-Protokolls eine bestimmte Datenversion zurückverfolgt wird.
Empfohlenes Lernen: MySQL-Video-Tutorial
Das obige ist der detaillierte Inhalt vonZusammenfassung der Probleme zur Konsolidierung der Grundlage von MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!