Erzählen Sie mir weiter, ich bin zu einem Vorstellungsgespräch nach Shanghai Meituan gefahren und hatte damals auch keine technischen Probleme Sagen Sie, es ist schlecht oder gut. Wie auch immer, es gab dem Interviewer einfach kein angenehmes Gefühl.
Es ist schlimm, es ist bei vielen Dingen das Gleiche. Normalerweise geht es mir gut, aber wenn es Zeit für das Vorstellungsgespräch ist, fällt mir nichts mehr ein.
Obwohl ich an Java
开发快五年
了(2017年),用过Oracle
数据库(银行里的系统),但大多数时候都是使用MySQL
Datenbanken arbeite, war ich immer noch verwirrt, als ich mit dieser Frage konfrontiert wurde (ich habe in den sauren Apfel gebissen und ein wenig geredet) Der Interviewer würde Fragen zu Indizierung, langsamen Abfragen, Leistungsoptimierung usw. stellen. usw. (Denn das sind alles Interviewfragen, die ich online gefunden und auswendig gelernt habe).
Heute werden wir überJava
Entwickler, aber sie beschäftigen sich im täglichen Entwicklungsprozess häufig mit MySQL-Datenbanken. Wenn das Unternehmen );font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">DBA can viel machen, aber immer noch ein bisschen besser, wenn es kein DBA
ist von Kein Nutzen, wir sind immer noch sehr Es ist notwendig zu verstehenMySQL
的架构体系,尽管咱们是Java
开发人员,但是在日常开发过程中也会经常和MySQL数据库打交道。如果公司有DBA
能干点事还稍微好点,如果是没有DBA
或者DBA
没什么用的情况下,我们还是很有必要了解MySQL
的整个体系的,况且在面试中遇到了也是一个加分项。
想要知道一条SQL
是怎么查询的,只要对MySQL
整个体系搞清楚了,才能说出个123。
所以于情于理,我们很有必要学习一下MySQL
的架构体系的。
平时,我和小伙伴们聊天的时候,经常会把MySQL
Wie SQL
abgefragt wird, nur MySQL
Nur wenn das gesamte System verstanden ist, können wir 123 sagen. 🎜🎜🎜Es ist also notwendig, dass wir etwas über Emotionen und Vernunft lernenMySQL
s Architektur. 🎜🎜Wenn ich mit meinen Freunden chatte, verwende ich normalerweise oft Was ist MySQL?
MySQL AB code>Von der Firma entwickelt, gehört es derzeit zu
Oracle
Company . MySQL
是一个关系型数据库管理系统,由瑞典MySQL AB
公司开发,目前属于Oracle
公司。
MySQL
是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL
是开源的,所以你不需要支付额外的费用。MySQL
支持大型的数据库,可以处理拥有上千万条记录的大型数据库。MySQL
使用标准的SQL数据语言形式。MySQL
可以允许于多个系统上,并且支持多种语言,这些编程语言包括C、C++、Python、Java、Ped、PHP、Eifel、Ruby和TCL等。MySQL
🎜MySQL</ code> unterstützt große Datenbanken und kann große Datenbanken mit mehreren zehn Millionen Datensätzen verarbeiten. </section></li>🎜🎜<code style=" font-size: rgba mono consolas monaco menlo monospace break-all rgb>MySQL Code>Verwendet die Standardform der SQL-Datensprache. 🎜🎜<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba( 27, 31, 35, 0.05);font-family: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>MySQL</ code> kann auf mehreren Systemen verwendet werden und unterstützt mehrere Sprachen, darunter C, C++, Python, Java, Ped, PHP, Eifel, Ruby und TCL usw. </section></li>🎜🎜<code style=" font-size: rgba mono consolas monaco menlo monospace break-all rgb>MySQL code> bietet gute Unterstützung für PHP, die derzeit beliebteste Webentwicklungssprache.<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>MySQL
unterstützt große Datenbanken, Unterstützt ein Data Warehouse mit 50 Millionen Datensätzen. Die 32-Bit-Systemtabellendatei kann maximal 4 GB unterstützen, und das 64-Bit-System unterstützt eine maximale Tabellendatei von 8 TB. MySQL
是可以定制的,采用了GPL协议,你可以修改源码来开发自己的MySQL
系统。
请注意
MySQL
拼写,另外,很多人可能有疑问,为什么MySQL
的logo是一条海豚?
下面我们就来看看MySQL
的整体架构图。
再来看看我们开发的系统架构图:
其实还是蛮相似的,都有分层的概念。既然我们开发的软件系统能进行分层,那么MySQL
MySQL
System. 🎜🎜? Wenn Sie mit Gateway nicht vertraut sind, können wir mich verstehen ist eingestellt aufBitte beachten Sie
MySQL
Rechtschreibung, außerdem haben viele Leute möglicherweise Fragen, warumWerfen wir einen Blick darauf
MySQL-Architekturdiagramm
Werfen wir einen Blick auf das von uns entwickelte Systemarchitekturdiagramm: 🎜
Eigentlich sind sie ziemlich ähnlich Konzept der Schichtung. Da das von uns entwickelte Softwaresystem geschichtet sein kann, gilt
MySQL
的分层情况以及每一层的功能。架构图分层
上面的架构图我们可以对其进行拆分,并做简要的说明。
连接层
与客户端打交道,上面已经写明了能支持的的语言。客户端的链接支持的协议很多,比如我们在
Java
开发中的JDBC
。这一层是不是有点像我们项目中的
网关层
?如果对网关不熟悉,那我们可以理解我controller
Architekturdiagramm-Layering
Mit Kunden Für den Umgang mit dem Terminal wurden oben die unterstützten Sprachen angegeben. Der Client-Link unterstützt viele Protokolle, zum Beispiel haben wir (27, 31, 35, 0.05);Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, Monospace;Wortumbruch: Break-All;Farbe: RGB (239, 112, 96);">Java In Entwicklung
JDBC
. Ist diese Ebene nicht ein bisschen wie die in unserem Projekt? : rgba(27, 31, 35, 0.05);font-family: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break -all;color: rgb(239, 112, 96);"> Gateway-Schicht
MySQL
也提供了这种“按需使用”的方式。你可以将参数query_cache_type
设置成DEMAND
,这样对于默认的SQL语句都不使用查询缓存。
「注意」:MySQL 8.0
Nach Abschluss der lexikalischen Analyse müssen Sie eine „grammatikalische Analyse“ durchführen. Basierend auf den Ergebnissen der lexikalischen Analyse bestimmt der Syntaxanalysator anhand grammatikalischer Regeln, ob die von Ihnen eingegebene SQL-Anweisung der MySQL-Syntax entspricht.
Wenn wir bei der Schreibweise von SQL einen falschen Buchstaben vergessen oder schreiben, erhalten wir eine Fehlererinnerung mit „You have an error in your SQL syntax
“.
Zum Beispiel im folgenden Fall:
Der Fehler besteht darin, dass im WHERE-Schlüsselwort ein E fehlt.
Ebenso nutzen wir SQL, wenn ein bestimmtes Feld nicht existiert.
Im Allgemeinen werden Grammatikfehler an der ersten Stelle angezeigt, an der der Fehler auftritt. Sie sollten daher auf den Inhalt achten, der unmittelbar nach „in der Nähe“ folgt. Dies dient nur als Referenz .
Das SQL wurde vom Analysator analysiert und es wurde kein Fehler gemeldet. Geben Sie dann zu diesem Zeitpunkt den Optimierer ein, um die SQL zu optimieren.
Optimierer
Der Optimierer wird hauptsächlich verwendet, um zu entscheiden, welcher Index verwendet werden soll, wenn unsere Datenbanktabelle mehrere Indizes enthält oder wenn eine Anweisung mehrere Tabellenzuordnungen (Joins) aufweist. Bestimmen Sie die Verknüpfungsreihenfolge jeder Tabelle.
Zum Beispiel:
SELECT a.id, b.id FROM t_user a join t_user_detail b WHERE a.id=b.user_id and a.user_name='田维常' and b.id=10001
Dadurch wird die bedingte Abfrage optimiert.
Nach Abschluss der Optimierungsverarbeitung wurde der SQL-Ausführungsplan festgelegt. Anschließend geht es weiter in den Antrieb.
Executor
Zunächst müssen Sie die Berechtigungen ermitteln, also ob Sie die Berechtigung haben, dieses SQL auszuführen. Bei einigen Clients können die Berechtigungen während der Arbeit kontrolliert werden.
Zum Beispiel: In der Produktionsumgebung haben die meisten Entwickler nur Abfrageberechtigungen und keine Berechtigungen zum Hinzufügen, Löschen oder Ändern (mit Ausnahme einiger kleiner Unternehmen).
Wenn Sie die Erlaubnis haben, öffnen Sie die Tabelle und fahren Sie mit der Ausführung fort. Wenn eine Tabelle geöffnet wird, verwendet der Executor die von der Engine bereitgestellte Schnittstelle basierend auf der Engine-Definition der Tabelle.
Speicher-Engine-Schicht
Diese Schicht kann als Persistenzschicht in unserem Geschäftssystem verstanden werden.
Das Konzept der Speicher-Engine gibt es nur bei MySQL. Nicht alle relationalen Datenbanken verfügen über das Konzept der Speicher-Engine.
Die Datenbankspeicher-Engine ist die zugrunde liegende Softwareorganisation der Datenbank. Das Datenbankverwaltungssystem (DBMS) verwendet die Daten-Engine zum Erstellen, Abfragen, Aktualisieren und Löschen von Daten. Verschiedene Speicher-Engines bieten unterschiedliche Speichermechanismen, Indizierungstechniken, Sperrebenen und andere Funktionen. Durch die Verwendung verschiedener Speicher-Engines können Sie auch bestimmte Funktionen erhalten. Heutzutage unterstützen viele verschiedene Datenbankverwaltungssysteme eine Vielzahl unterschiedlicher Daten-Engines.
Da Daten in Form einer Tabelle in einer relationalen Datenbank gespeichert werden, kann die Speicher-Engine auch als Tabellentyp bezeichnet werden (Tabellentyp, dh die Art der Speicherung und Operation dieser Tabelle).
MySQL Version 5.5 (MySQL-Version
MySQL Version 5.5 (MySQL-Version >= Version 5.5) und höher, die Standardspeicher-Engine ist InnoDB.
Das Folgende ist ein Vergleich einiger relativ häufig verwendeter Engines:
In tatsächlichen Projekten verwenden die meisten InnoDB, dann MyISAM und zumindest andere Speicher-Engines.
Wir können den Befehl verwenden, um anzuzeigen, welche Speicher-Engines MySQL bereitgestellt hat:
show engies;
Wir können auch den Befehl verwenden, um die aktuelle Standard-Speicher-Engine von MySQL anzuzeigen:
Variablen wie „%storage_engine%“ anzeigen;
Der Unterschied zwischen MyISAM
- und InnoDB
-EnginesMyISAM
与 InnoDB
引擎的区别
MySQL
Wie wähle ich zwischen den beiden Speicher-Engines?
Gibt es Transaktionsvorgänge? Ja, InnoDB. Speichern Sie gleichzeitige Änderungen? Ja, InnoDB. Verfolgen Sie schnelle Abfragen mit weniger Datenänderungen? Ja, MyISAM. Verwenden Sie die Volltextindizierung? Wenn Sie nicht auf ein Drittanbieter-Framework verweisen, können Sie MyISAM wählen, es ist jedoch effizienter, ein Drittanbieter-Framework und InnDB zu verwenden. Die InnoDB-Speicher-Engine verfügt hauptsächlich über die folgenden Funktionen: Unterstützt Transaktionen
Unterstützung Das Lesen mehrerer Versionen unterstützt Sperren auf Zeilenebene. Lese- und Schreibblockierungen hängen von der Isolationsstufe der Transaktion ab
Unterstützt Caching, das sowohl Indizes als auch Daten zwischenspeichern kann
Die gesamte Tabelle und die Primärschlüssel werden im Cluster-Modus gespeichert, um einen ausgeglichenen Baum zu bilden
Natürlich nicht Es wird gesagt, dass InnoDB gut sein muss. In der tatsächlichen Entwicklung müssen Sie sich je nach Szenario entscheiden, ob Sie InnoDB oder MyISAM verwenden möchten.
MyIASM (diese Engine war die Standardspeicher-Engine in MySQL-Datenbanken vor 5.5) Funktionen:
MyISAM bietet keine Unterstützung für Datenbanktransaktionen
Nicht unterstützte Zeile -Level-Sperren und Fremdschlüssel
Aufgrund von 2 muss beim Ausführen einer INSERT-Einfüge- oder UPDATE-Aktualisierungsanweisung, also beim Ausführen eines Schreibvorgangs, die gesamte Tabelle gesperrt werden, damit die Effizienz verbessert wird reduziert
MyISAM speichert die Anzahl der Zeilen in der Tabelle. Beim Ausführen von SELECT COUNT(*) FROM TABLE
können die relevanten Werte direkt gelesen werden, ohne die gesamte Tabelle zu scannen, was schnell ist.
Der Unterschied zwischen den beiden:
MyISAM ist transaktionssicher
MyISAM Die Granularität von. lock s ist auf Tabellenebene und InnoDB unterstützt Zeilenebene Schlösser
MyISAM unterstützt Volltextindizes, während InnoDB keine Volltextindizes vor MySQL5.6 unterstützt. Es unterstützt VOLLTEXT-Indizes ab MySQL5.6.
Vergleich der Nutzungsszenarien:
Wenn Sie eine große Anzahl ausgewählter Vorgänge ausführen möchten, sollten Sie MyISAM wählen
Wenn Sie auftreten möchten eine große Anzahl von Einfügungen und Ups Für Datumsoperationen sollte InnoDB ausgewählt werden
Große Datensätze neigen dazu, die InnoDB-Engine zu wählen, da sie die Transaktionsverarbeitung und Fehlerbehebung unterstützt. Die Größe der Datenbank bestimmt die Länge der Wiederherstellungszeit. InnoDB kann Transaktionsprotokolle für die schnellere Datenwiederherstellung verwenden. Primärschlüsselabfragen werden unter der InnoDB-Engine ebenfalls recht schnell sein, es ist jedoch zu beachten, dass ein zu langer Primärschlüssel auch zu Leistungsproblemen führt.
Relativ gesehen wird InnoDB eher von Internetunternehmen genutzt.
Systemdateispeicherschicht
Diese Schicht kann auch als Datenbank in unserem Geschäftssystem verstanden werden.
Die Systemdateispeicherschicht ist hauptsächlich dafür verantwortlich, Datenbankdaten und Protokolle in Systemdateien zu speichern und gleichzeitig die Transaktion mit der Speicher-Engine abzuschließen. Es handelt sich um die physische Speicherschicht von Dateien.
Zum Beispiel: Datendateien, Protokolldateien, PID-Dateien, Konfigurationsdateien usw.
Datendatei
„db.opt-Datei“: Zeichnen Sie den Standardzeichensatz und die Überprüfungsregeln dieser Datenbank auf.
"frm-Datei": Im Edge gespeicherte Metadateninformationen, einschließlich Definitionsinformationen der Tabellenstruktur usw. Jede Tabelle verfügt über eine entsprechende FRM-Datei.
„MYD-Datei“: Eine Datei für die MyISAM-Speicher-Engine, die die Dateninformationen der MyISAM-Tabelle speichert. Jede MyISAM-Tabelle verfügt über eine .MYD-Datei.
「MYI文件」:也是MyISAM存储引擎专用的文件,存放MyISAM表的索引相关信息,每一张MyISAM表都有对应的.MYI文件。
「ibd文件和ibdata文件」:存放InnoDB的数据文件(包括索引)。InnoDB存储引擎有两种表空间方式:独立表空间和共享表空间。
独享表空间使用ibd文件来存放数据,并且每一张InnoDB表存在与之对应的.ibd文件。
共享表空间使用ibdata文件,所有表共同使用一个或者多个.ibdata文件。
「ibdata1文件」:系统表空间数据文件,存储表元数据、Undo日志等。
「ib_logfile0、ib_logfile0文件」:Redo log日志文件。
日志文件
错误日志:默认是开启状态,可以通过命令查看:
show variables like '%log_error%';
二进制日志binary log:记录了对MySQL数据库执行的更改操作,并且记录了语句的发生时间、执行耗时;但是不记录查询select、show等不修改数据的SQL。主要用于数据库恢复和数据库主从复制。也是大家常说的binlog日志。
show variables like '%log_log%';//查看是否开启binlog日志记录。
show variables like '%binllog%';//查看参数
show binary logs;//查看日志文件
慢查询日志:记录查询数据库超时的所有SQL,默认是10秒。
show variables like '%slow_query%';//查看是否开启慢查询日志记录。
show variables '%long_query_time%';//查看时长
通用查询日志:记录一般查询语句;
show variables like '%general%';
配置文件
用于存放MySQL所有的配置信息的文件,比如:my.cnf、my.ini等。
「pid文件」
pid文件是mysqld应用程序在Linux或者Unix操作系统下的一个进程文件,和许多其他Linux或者Unix服务端程序一样,该文件放着自己的进程id。
「socket文件」
socket文件也是Linux和Unix操作系统下才有的,用户在Linux和Unix操作系统下客户端连接可以不通过TCP/IP网络而直接使用Unix socket来连接MySQL数据库。
SQL查询流程图
Zusammenfassung
MySQL
Wir können uns das gesamte System als ein Softwaresystem vorstellen, das wir täglich entwickeln. Es verfügt auch über eine Zugriffsschicht, die für die Verbindung mit externen Clients ausgelegt ist. Sie ist dem Gateway unseres Systems sehr ähnlich. und der Cache ähnelt dem in unserem Geschäftscode. Der verwendete Cache und Parser können als Mittel zur Optimierung des Codes im Geschäftssystem verwendet werden Die Engine entspricht unserer Persistenzschicht und das Dateisystem entspricht der gesamten Geschäftsdatenbank. MySQL
整个系统我们可以看成是我们日常开发的软件系统,也有接入层,专门对接外面客户端的,和我们系统的网关就很像,缓存也就类似我们业务代码中使用的缓存,解析器可以理解为业务系统中参数解析以及参数校验,优化层可以当做我们开发代码优化的手段,然后存储引擎就相当于我们的持久层,文件系统相当于整个业务系统中的数据库。
可能比喻不是非常的恰当,但是希望大家能领略轻重的含义,目的只有一个,那就是让大家能轻松掌握MySQL
Vielleicht ist die Metapher nicht sehr passend, aber ich hoffe, dass jeder die Bedeutung von Strenge verstehen kann. Es gibt nur einen Zweck, nämlich es jedem leicht verständlich zu machenMySQL
s Gesamtsituation.
Einige Bilder im Artikel stammen aus dem Internet und werden gelöscht!
Beneiden Sie nicht jeden Tag einige großartige Menschen oder großartige Götter, sie sind auch Schritt für Schritt gekommen. Seien Sie zuversichtlich, solange Sie es Stück für Stück tun und bodenständig vorgehen, werden Sie ein großer Meister.
Empfohlene Lektüre
-
Wenn du dich nicht bewegst, bewege ich mich nicht ---Beobachtermodus
🎜
Zusammenfassung der Interviews mit 4 Unternehmen in 10 Tagen nach dem Rücktritt
Das Back-End-Interview kostete 230.000 Yuan und mehr als 500 Seiten, was großartig ist!
Wenn der Abfragecache nicht erreicht wird, beginnt die eigentliche Ausführung der Anweisung. Zunächst muss MySQL wissen, was Sie tun möchten, also muss es die SQL-Anweisung analysieren. Der Analysator führt zunächst eine „lexikalische Analyse“ durch. Was Sie eingeben, ist eine SQL-Anweisung, die aus mehreren Zeichenfolgen und Leerzeichen besteht. MySQL muss identifizieren, was die darin enthaltenen Zeichenfolgen sind und was sie darstellen. 🎜Das obige ist der detaillierte Inhalt vonMeituan-Interviewer: Erklären Sie klar und deutlich das MySQL-Struktursystem und machen Sie sofort ein Angebot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!