Dieser Artikel vermittelt Ihnen relevantes Wissen über MySQL. Er stellt hauptsächlich einige häufig gestellte Fragen in Interviews zusammen, darunter Datenbankarchitektur, Indizierung und SQL-Optimierung usw. Ich hoffe, dass er für alle hilfreich ist.
Empfohlenes Lernen: MySQL-Tutorial
Das logische Architekturdiagramm von MySQL ist hauptsächlich in drei Schichten unterteilt:
(1) Die erste Schicht ist für die Verbindungsverarbeitung, Autorisierungsauthentifizierung, Sicherheit usw. verantwortlich.
(2) Die zweite Schicht ist für das Kompilieren und verantwortlich Optimierung von SQL
(3) Die dritte Schicht ist die Speicher-Engine.
1.2. Wie wird eine SQL-Abfrageanweisung in MySQL ausgeführt?
eine Berechtigung
hat. Wenn keine Berechtigung vorliegt, wird direkt eine Fehlermeldung zurückgegeben. Wenn eine Berechtigung vorliegt, wird zuerst der Cache abgefragt (vor MySQL8.0-Version). ). 是否有权限
,如果没有权限,直接返回错误信息,如果有权限会先查询缓存(MySQL8.0 版本以前)。
如果没有缓存,分析器进行词法分析
,提取 sql 语句中 select 等关键元素,然后判断 sql 语句是否有语法错误,比如关键词是否正确等等。
最后优化器确定执行方案进行权限校验,如果没有权限就直接返回错误信息,如果有权限就会调用数据库引擎接口
lexikalische Analyse
durch, extrahiert Schlüsselelemente wie „select“ in der SQL-Anweisung und bestimmt dann, ob die SQL-Anweisung grammatikalische Fehler aufweist, z. B. ob die Schlüsselwörter sind richtig usw. Tabellenstruktur optimieren
(1) Versuchen Sie, numerische Felder zu verwenden. Wenn Felder, die nur numerische Informationen enthalten, versuchen Sie, sie nicht als Zeichentypen zu entwerfen. Es reduziert die Abfrage- und Join-Leistung und erhöht den Speicheraufwand. Dies liegt daran, dass die Engine bei der Verarbeitung von Abfragen und Verbindungen jedes Zeichen in der Zeichenfolge einzeln vergleicht und für numerische Typen nur ein Vergleich ausreicht. (2) Verwenden Sie so oft wie möglich varchar anstelle von charFelder mit variabler Länge haben wenig Speicherplatz und können Speicherplatz sparen.(4) Typspalte: eine der wichtigsten Spalten. Stellt die Art der Zuordnung oder den Zugriffstyp dar, mit dem MySQL bestimmt, wie Zeilen in der Tabelle gefunden werden. Vom besten zum schlechtesten: System > ref_or_null > index_subquery > Die Abfrage könnte zum Suchen verwendet werden.
(7) Spalte „key_len“: Zeigt die Anzahl der von MySQL im Index verwendeten Bytes an. Mit diesem Wert kann berechnet werden, welche Spalten im Index verwendet werden.
(10) Zusätzliche Spalte: Zusätzliche Informationen anzeigen. Es gibt zum Beispiel „Index verwenden“, „Wo verwenden“, „Temporär verwenden“ usw.
Wenn wir normalerweise SQL schreiben, müssen wir uns angewöhnen, Erklärungsanalysen zu verwenden. Statistiken über langsame Abfragen, Betrieb und Wartung liefern uns regelmäßige Statistiken.
Optimierung langsamer Abfrageideen:
Analysieren Sie die Anweisung, ob unnötige Felder/Daten geladen werden.
Analysieren Sie den SQL-Ausführungssatz, ob er den Index erreicht usw.
Wenn die SQL sehr komplex ist, optimieren Sie die SQL-Struktur
Wenn die Menge der Tabellendaten zu groß ist, berücksichtigen Sie Untertabellen
(1) Eine Tabelle kann nur einen Clustered-Index haben, während eine Tabelle mehrere Nicht-Clustered-Indizes haben kann.
(2) Clustered-Index, die logische Reihenfolge der Schlüsselwerte im Index bestimmt die physische Reihenfolge der entsprechenden Zeilen in der Tabelle, die logische Reihenfolge des Index im Index unterscheidet sich von der physische Speicherreihenfolge der Zeilen auf der Festplatte.
(3) Der Index wird durch die Datenstruktur eines Binärbaums beschrieben. Wir können den Clustered-Index folgendermaßen verstehen: Die Blattknoten des Index sind die Datenknoten. Die Blattknoten von nicht gruppierten Indizes sind immer noch Indexknoten, verfügen jedoch über einen Zeiger, der auf den entsprechenden Datenblock zeigt.
(4) Clustered-Index: Physischer Speicher wird nach Index sortiert; Nicht-Cluster-Index: Physischer Speicher wird nicht nach Index sortiert
3.2 Warum B+-Baum verwenden?
3.2.1. Warum nicht ein gewöhnlicher Binärbaum?
3.2.2. Warum nicht ein ausgeglichener Binärbaum?
3.2.3. Warum nicht B-Baum, sondern B+-Baum?
B+ Alle Daten im Baumindex werden in Blattknoten gespeichert, und die Daten werden der Reihe nach angeordnet und mit der verknüpften Liste verknüpft. Dann macht B+ Tree die Bereichssuche, Sortiersuche, Gruppensuche und Deduplizierungssuche extrem einfach.
3.3. Was ist der Unterschied zwischen Hash-Index und B+-Baum-Index? Wie haben Sie sich für die Gestaltung des Index entschieden?
Wenn wir einen kombinierten Index wie (a1, a2, a3) erstellen, entspricht dies der Erstellung von drei Indizes (a1), (a1, a2) und (a1, a2, a3), die am weitesten links übereinstimmen Prinzip.
3.5. Welche Szenarien sind nicht für die Indizierung geeignet?
4.1 Sind Sie jemals auf ein Deadlock-Problem in MySQL gestoßen?
(1) Überprüfen Sie das Deadlock-Protokoll und zeigen Sie den Innodb-Status der Engine an.
(2) Finden Sie den Deadlock-Sql heraus.
(3) Analysieren Sie die SQL-Sperrsituation Sperrprotokoll
(6) Analyse der Deadlock-Ergebnisse
4.2. Was sind optimistische Sperren und pessimistische Sperren in der Datenbank und ihre Unterschiede?
(1) Pessimistische Sperre:
(2) Optimistische Sperre:
Der „Optimismus“ der optimistischen Sperre spiegelt sich in der Tatsache wider, dass davon ausgegangen wird, dass sich die Daten nicht zu häufig ändern. Daher ist es möglich, dass mehrere Transaktionen gleichzeitig Änderungen an den Daten vornehmen.
Implementierungsmethode: Optimistisches Sperren wird im Allgemeinen mithilfe des Versionsnummernmechanismus oder des CAS-Algorithmus implementiert.
4.3. Kennen Sie MVCC und kennen die zugrunde liegenden Prinzipien?
MVCC (Multiversion Concurrency Control), eine Technologie zur Steuerung der Parallelität mehrerer Versionen.
Konsistenz: bedeutet, dass die Daten vor Beginn und nach Ende der Transaktion nicht zerstört werden. Wenn Konto A 10 Yuan auf Konto B überweist, bleibt der Gesamtbetrag von A und B unabhängig von Erfolg oder Misserfolg unverändert.
Persistenz: Gibt an, dass nach Abschluss der Transaktion die durch die Transaktion an der Datenbank vorgenommenen betrieblichen Änderungen dauerhaft in der Datenbank gespeichert werden.
5.2. Was sind die Isolationsstufen von Transaktionen? Was ist die Standardisolationsstufe von MySQL?
Transaktionen A und B werden abwechselnd ausgeführt. Transaktion A wird durch Transaktion B gestört, da Transaktion A nicht festgeschriebene Daten von Transaktion B liest. Dies ist ein Dirty Read.
Transaktion A fragt die Ergebnismenge eines Bereichs ab, und eine andere gleichzeitige Transaktion B fügt Daten in diesen Bereich ein bzw. löscht sie und schreibt sie stillschweigend fest. Anschließend fragt Transaktion A denselben Bereich erneut ab, und die durch die beiden Lesevorgänge erhaltenen Ergebnismengen sind unterschiedlich. Das Gleiche gilt für Phantomlesung.
(1) Verwenden Sie den oberen Befehl, um zu beobachten und festzustellen, ob die Ursache auf MySQL oder andere Gründe zurückzuführen ist.
(3) Finden Sie die SQL mit hohem Verbrauch heraus und prüfen Sie, ob der Ausführungsplan korrekt ist, ob der Index fehlt und ob die Datenmenge zu groß ist.
(1) Beenden Sie diese Threads (und beobachten Sie, ob die CPU-Auslastung abnimmt)
(3) Neustart Führen Sie diese aus SQLs.
Es ist auch möglich, dass jede SQL-Anweisung nicht viele Ressourcen verbraucht, aber plötzlich eine große Anzahl von Sitzungsverbindungen eingeht, was zu einem CPU-Anstieg führt. In diesem Fall müssen Sie mit der Anwendung arbeiten Um zu analysieren, warum die Anzahl der Verbindungen ansteigt, nehmen Sie dann entsprechende Anpassungen vor, z. B. die Begrenzung der Anzahl der Verbindungen usw.
Ein Server öffnet N Links für die Verbindung von Clients, sodass große gleichzeitige Aktualisierungsvorgänge stattfinden, aber es gibt nur einen Thread zum Lesen des Binlogs vom Server. Wenn ein bestimmtes SQL auf dem Slave-Server ausgeführt wird, dauert es etwas länger Es kann lange dauern oder weil eine bestimmte SQL die Tabelle sperren muss, was zu einem großen SQL-Rückstand auf dem Master-Server führt und nicht mit dem Slave-Server synchronisiert wird. Dies führt zu einer Master-Slave-Inkonsistenz, also einer Master-Slave-Verzögerung.
Lösung für die Master-Slave-Synchronisationsverzögerung
Der Master-Server ist für den Aktualisierungsvorgang verantwortlich und hat höhere Sicherheitsanforderungen als der Slave-Server, daher können einige Einstellungsparameter geändert werden, wie z. B. sync_binlog=1, innodb_flush_log_at_trx_commit = 1 usw. Einstellungen usw.
Wählen Sie ein besseres Hardwaregerät als Slave.
Verwenden Sie einen Slave-Server als Backup, ohne Abfragen bereitzustellen. Die Belastung auf dieser Seite wird reduziert und die Effizienz der Ausführung des SQL im Relay-Protokoll ist natürlich höher.
Der Zweck des Hinzufügens von Slave-Servern besteht darin, den Lesedruck zu verteilen und dadurch die Serverlast zu reduzieren.
Subdatenbank- und Table-Sharding-Schema:
Horizontale Subdatenbank: Teilen Sie die Daten in einer Datenbank basierend auf Feldern und nach bestimmten Strategien (Hash, Bereich usw.) in mehrere Datenbanken auf.
Horizontale Tabellenaufteilung: Teilen Sie die Daten in einer Tabelle basierend auf Feldern und nach bestimmten Strategien (Hash, Bereich usw.) in mehrere Tabellen auf.
Vertikale Unterdatenbank: Basierend auf Tabellen werden verschiedene Tabellen je nach Unternehmenseigentum in verschiedene Datenbanken aufgeteilt.
Vertikale Tabellenaufteilung: Basierend auf den Feldern und entsprechend der Aktivität der Felder werden die Felder in der Tabelle in verschiedene Tabellen (Haupttabelle und erweiterte Tabelle) aufgeteilt.
Häufig verwendete Sharding-JDBC-Middleware:
Sharding-JDBC
Mycat
Probleme, die beim Sharding auftreten können.
Transaktionsfrage: Erforderlich. Verwenden Sie verteilte Transaktionen
Knotenübergreifendes Verknüpfungsproblem: Dieses Problem kann durch zwei Abfragen gelöst werden
Knotenübergreifende Zähl-, Sortier-, Gruppierungs- und Aggregationsfunktionsprobleme: jeweils auf jedem Knoten abrufen. Die Ergebnisse werden dann auf der Anwendungsseite zusammengeführt.
Datenmigration, Kapazitätsplanung, Erweiterung und andere Probleme
ID-Problem: Nach der Aufteilung der Datenbank können Sie sich nicht mehr auf den Primärschlüsselgenerierungsmechanismus der Datenbank selbst verlassen. Der einfachste Weg ist die Berücksichtigung der UUID
Cross-Sharding Sortier-Paging-Problem
Empfohlenes Lernen: MySQL-Lerntutorial
Das obige ist der detaillierte Inhalt vonSammlung von Fragen und Antworten zu MySQL-Interviews (Zusammenfassung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!