Heim >Datenbank >MySQL-Tutorial >Was sind die grundlegenden Probleme mit MySQL?
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.
Die MySQL-Datenbank selbst ist blockiert, zum Beispiel: unzureichende System- oder Netzwerkressourcen.
SQL-Anweisungen sind blockiert, wie zum Beispiel: Tabellensperren, Zeilensperren usw., was dazu führt, dass die Speicher-Engine die entsprechenden Aktionen nicht ausführt SQL-Anweisungen
Es wird zwar durch unsachgemäße Verwendung des Index und keine Indizierung verursacht
Die Eigenschaften der Daten in der Tabelle werden verwendet, aber die Anzahl der Tabellenrückgaben ist riesig
Für Zählfunktionen in der Form count(*)
, count(constant)
, count(primary key)
, die Optimierer Sie können den Index mit den geringsten Scankosten auswählen, um die Effizienz zu verbessern. Ihre Ausführungsprozesse sind gleich. count(*)
、count(常数)
、count(主键)
形式的count函数来说,优化器可以选择扫描成本最小的索引执行查询,从而提升效率,它们的执行过程是一样的。
而对于count(非索引列)
来说,优化器选择全表扫描,说明只能在聚集索引的叶子结点顺序扫描。
count(二级索引列)
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 niedrigsten sind.
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 im Index suchen muss und zurückgeben kann direkt danach, anstatt zur Tabelle zurückzukehren, um die Daten abzurufen, 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 das Geschäft dies zulässt
Geeignete Indizes hinzufügen: Indizieren Sie die Felder als Abfragebedingungen und sortieren Sie sie nach. Berücksichtigen Sie mehrere Abfragefelder, um einen kombinierten Index zu erstellen. Achten Sie dabei auf die Kombination Platzieren Sie in der Reihenfolge der Indexfelder die Spalten, die am häufigsten als restriktive Bedingungen verwendet werden, ganz links in absteigender Reihenfolge. Die Indizes sollten 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
12 Was sind die Isolationsstufen von Transaktionen?
„Serialisierbar“ kann das Auftreten von schmutzigen Lesevorgängen, nicht wiederholbaren Lesevorgängen und Phantom-Lesevorgängen vermeiden ist „Wiederholbares Lesen“
#🎜 🎜#1 Was sind die Indexkategorien?
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.
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: Der durch Nicht-Primärschlüssel erstellte Index speichert den Primärschlüssel und die Indexspalte im Blattknoten Primärschlüssel auf dem Blatt und überprüfen Sie dann die zu findenden 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 a bezeichnet abdeckender Index.
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.
Der B-Baum 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 Die Anzahl der zufälligen E/A-Vorgänge führt zu Leistungseinbußen.
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 durchsuchen Untergeordnete Knoten Das Springen zwischen Dateien kann viel Festplatten-E/A-Zeit sparen.
Binärbaum: Die Höhe des Baums ist ungleichmäßig und kann nicht selbstausgleichend sein. 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.
In InnoDB speichert der Blattknoten des Index B+ Tree die gesamte Datenzeile und ist der Primärschlüsselindex, auch Clustered-Index genannt, der den Datenspeicher und den Index zusammenfügt. Sie finden die Daten.
Die Blattknoten des Index B + Baum speichern den Wert des Primärschlüssels, bei dem es sich um einen Nicht-Primärschlüsselindex handelt, der auch als nicht gruppierter Index und 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 mehr neigen wir dazu, vollständige Tabellenscans zu verwenden.
Dabei geht es nicht unbedingt darum, ob alle von der Abfrageanweisung benötigten Felder den Index erreichen. Wenn alle Felder den Index erreichen, besteht keine Notwendigkeit, eine Abfrage zurück 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.
Das Präfixprinzip ganz links hat bei der Erstellung eines mehrspaltigen Index je nach Geschäftsanforderungen die am häufigsten verwendete Spalte in der Where-Klausel ganz links.
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 ein Index in der Reihenfolge a, b, c, d eingerichtet ist, wird d nicht für die Indizierung verwendet. Wenn Sie einen Index von (a, b, d, c) erstellen, kann er verwendet werden a, 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. Sie können (a, b, c)-Indizes in beliebiger Reihenfolge erstellen. Der Abfrageoptimierer von MySQL hilft Ihnen bei der Optimierung in etwas, das an der Indexform erkennbar ist.
Wenn das Prinzip des Präfixes ganz links erfüllt ist, kann das Präfix ganz links zum Auffinden 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 Indexbedingungs-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 Tabellen reduzieren kehrt zurück.
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, entsteht eine neue Seite wird automatisch geöffnet. 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.
„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 das Redo-Protokoll, um dies zu erreichen. 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“: Erreichen Sie Konsistenz durch Rollback, Wiederherstellung und Isolation in gleichzeitigen Situationen.
InnoDB-Speicher-Engine: Die Blattknoten des B+-Baumindex speichern die Daten selbst;
MyISAM-Speicher-Engine: Die Blattknoten des B+-Baumindex speichern die physische Adresse der Daten; InnoDB, seine Datendatei selbst ist Indexdateien, im Vergleich zu MyISAM sind die Tabellendatendateien selbst eine von B+Tree organisierte Indexstruktur Der Schlüssel dieses Index ist der Primärschlüssel der Tabelle, daher ist die InnoDB-Tabellendatendatei selbst der Primärindex, der als „Clustered-Index“ oder Clustered-Index bezeichnet wird, und die übrigen Indizes dienen als Sekundärindizes Das Datenfeld des Sekundärindex speichert den Wert des Primärschlüssels des entsprechenden Datensatzes anstelle der Adresse. Dies unterscheidet sich ebenfalls von MyISAM.
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.
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.
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 dies eine Woche lang beobachtet haben Gibt es keine Probleme, schließen Sie die einzelne Datenbank. Beobachten Sie den Leseverkehr für eine Weile. Nachdem er stabil geblieben ist, schließen Sie den Schreibverkehr der einzelnen Datenbank und wechseln Sie reibungslos zur Unterdatenbank und Untertabelle.
Die Schritte für die Serverebene zum Ausführen von SQL nacheinander sind:
Client-Anfrage –> Connector (Benutzeridentität überprüfen, Berechtigungen erteilen) –> Cache abfragen (direkt zurückgeben, wenn Cache vorhanden ist). , Wenn es nicht vorhanden ist, werden nachfolgende Vorgänge ausgeführt) -> Bevor die von dieser Engine bereitgestellte Schnittstelle verwendet wird, wird zunächst geprüft, ob der Benutzer über Ausführungsberechtigungen verfügt. -> Gehen Sie zur Engine-Ebene, um die Datenrückgabe zu erhalten (wenn der Abfrage-Cache aktiviert ist, werden die Abfrageergebnisse zwischengespeichert).
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 der Speicher nicht so viele Daten speichern 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 teilt MySQL diese in mehrere separate temporäre Dateien auf, um die sortierten Daten zu speichern, und führt diese Dateien dann zu einer großen Datei zusammen.
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.
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. Während der Transaktionsausführung wird das Protokoll zunächst in den Binlog-Cache geschrieben. Wenn die Transaktion übermittelt wird, wird der Binlog-Cache in die binlog-Datei geschrieben.
Nachdem das Datenelement gelöscht wurde, 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.
Das Binlog-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 Sicherungsoperationsdaten gibt .
Anweisung: die aufgezeichnete Quell-SQL-Anweisung
gemischt: Die ersten beiden sind gemischt. Warum benötigen Sie eine Datei im gemischten Format, da einige Binlogs im Anweisungsformat zu Inkonsistenzen zwischen primärem und sekundärem Zeilenformat führen können? verwendet wird. Der Nachteil des Zeilenformats besteht jedoch darin, dass es viel Platz beansprucht. MySQL ist einen Kompromiss eingegangen. MySQL selbst ermittelt, 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. Sperrregeln für MySQL
„Dirty Reading“: Unter Dirty Reading versteht man das Lesen nicht festgeschriebener Daten aus anderen Transaktionen, was bedeutet, dass die Daten möglicherweise zurückgesetzt werden, was bedeutet, dass sie am Ende möglicherweise nicht in der Datenbank gespeichert werden liegen keine Daten vor. Das Lesen von Daten, die möglicherweise nicht mehr vorhanden sind, wird als Dirty Reading bezeichnet.
In Bezug auf Sperrtypen gibt es gemeinsame Sperren und exklusive Sperren.
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线程
I/O-Thread
, um das Bin-Log-Protokoll durch Anfrage zu lesen den Binlog-Dump-Thread und schreiben Sie dann in das relay log
-Protokoll der Slave-Bibliothek. SQL-Thread
, der überwacht, ob der Inhalt des Relay-Log-Protokolls in Echtzeit aktualisiert wird, und die SQL-Anweisungen darin analysiert die Datei in der Datenbank ausführen. 2 Was sind die MySQL-Master-Slave-Replikationsmethoden?
Asynchrone Replikation:
MySQL-Master-Slave-Synchronisation Der Standardwert ist die asynchrone Replikation. 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 synchroner Replikation wird, nachdem der Master-Host das Ereignis an den Slave-Host gesendet hat, eine Wartezeit ausgelöst, bis alle Slaves Der Knoten sendet (bei mehreren Slaves) Informationen über die erfolgreiche Datenreplikation an den Master zurück.Große Transaktion: Teilen Sie große Transaktionen in kleine Transaktionen auf und aktualisieren Sie Daten in Stapeln
bin log ist eine Datei auf der MySQL-Datenbankebene. Sie zeichnet alle Vorgänge auf, die die MySQL-Datenbank ändern.
Das obige ist der detaillierte Inhalt vonWas sind die grundlegenden Probleme mit MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!