Continuez à partager avec vous, je suis allé à Shanghai Meituan pour un entretien et j'ai rencontré des problèmes techniques à ce moment-là, les réponses étaient également médiocres. dites que c'est mauvais ou bon. Quoi qu'il en soit, cela n'a tout simplement pas donné à l'intervieweur un sentiment agréable.
C’est mauvais, c’est pareil pour beaucoup de choses. En général, je me sens bien, mais une fois l’heure de l’entretien arrivée, je ne pense à rien.
Bien que je travaille sur des Java
开发快五年
了(2017年),用过Oracle
数据库(银行里的系统),但大多数时候都是使用MySQL
bases de données, j'étais toujours confus face à cette question (j'ai mordu la balle et j'ai parlé un peu). Je pensais que l'intervieweur allait poser des questions sur l'indexation, les requêtes lentes, l'optimisation des performances, etc. (Parce que ce sont toutes des questions d'entretien que j'ai trouvées en ligne et mémorisées).
Aujourd'hui, nous allons parler de Le système d'architecture de MySQL
, bien que nous soyons Développeurs Java
, mais ils traitent souvent des bases de données MySQL dans le processus de développement quotidien. Si l'entreprise possède );font-family : "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">DBA peut faites beaucoup mais quand même un peu Mieux, s'il n'y a pas de DBA
ouDBA est de ça ne sert à rien, on est quand même très Il faut comprendreMySQL L'ensemble du système de
. D'ailleurs, le rencontrer lors de l'entretien est aussi un plus. MySQL
的架构体系,尽管咱们是Java
开发人员,但是在日常开发过程中也会经常和MySQL数据库打交道。如果公司有DBA
能干点事还稍微好点,如果是没有DBA
或者DBA
没什么用的情况下,我们还是很有必要了解MySQL
的整个体系的,况且在面试中遇到了也是一个加分项。
想要知道一条SQL
是怎么查询的,只要对MySQL
整个体系搞清楚了,才能说出个123。
所以于情于理,我们很有必要学习一下MySQL
的架构体系的。
平时,我和小伙伴们聊天的时候,经常会把MySQL
Comment SQL
est interrogé, juste MySQL
Ce n'est que lorsque l'ensemble du système est compris que nous pouvons dire 123. 🎜🎜🎜Il nous est donc nécessaire d'en apprendre davantage sur l'émotion et la raisonL'architecture MySQL
. 🎜🎜Normalement, lorsque je discute avec mes amis, j'utilise souvent MySQL
est un système logiciel que nous développons. Puisqu'il s'agit d'un système logiciel, il existe un diagramme d'architecture, comment l'architecture est en couches et quelles sont les fonctions de chaque couche. 🎜
MySQL
est Un système de gestion de base de données relationnelle développé par la Suède, 31, 35, 0.05); famille de polices : "Operator Mono", Consolas, Monaco, Menlo, monospace ; coupure de mot : break-all ; couleur : rgb (239, 112, 96 );">MySQL AB code>Développé par l'entreprise, il appartient actuellement à Oracle
Société . MySQL
是一个关系型数据库管理系统,由瑞典MySQL AB
公司开发,目前属于Oracle
公司。MySQL
是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL
是开源的,所以你不需要支付额外的费用。MySQL
支持大型的数据库,可以处理拥有上千万条记录的大型数据库。MySQL
使用标准的SQL数据语言形式。MySQL
可以允许于多个系统上,并且支持多种语言,这些编程语言包括C、C++、Python、Java、Ped、PHP、Eifel、Ruby和TCL等。MySQL
🎜MySQL Code> est un système de gestion de base de données relationnelle qui stocke les données dans différentes tables au lieu de placer toutes les données dans un seul grand entrepôt, ce qui augmente la vitesse et améliore la flexibilité.
MySQL Le code est open source, vous n'avez donc pas besoin de payer de supplément. 🎜🎜<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);famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>MySQL code> prend en charge les grandes bases de données et peut gérer de grandes bases de données contenant des dizaines de millions d'enregistrements. 🎜🎜<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);famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>MySQL code>Utilise le formulaire de langage de données SQL standard. 🎜🎜<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);famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>MySQL code> peut être utilisé sur plusieurs systèmes et prend en charge plusieurs langages de programmation : C, C++, Python, Java, Ped, PHP, Eifel, Ruby et TCL, etc. 🎜🎜<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);famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>MySQL code> prend bien en charge PHP, qui est actuellement le langage de développement Web le plus populaire.<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 break-all rgb>MySQL
prend en charge les grandes bases de données, Prend en charge un entrepôt de données de 50 millions d'enregistrements. Le fichier de table système 32 bits peut prendre en charge un maximum de 4 Go, et le système 64 bits prend en charge un fichier de table maximum de 8 To. MySQL
支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
MySQL
是可以定制的,采用了GPL协议,你可以修改源码来开发自己的MySQL
系统。请注意
MySQL
拼写,另外,很多人可能有疑问,为什么MySQL
的logo是一条海豚?
下面我们就来看看MySQL
的整体架构图。
再来看看我们开发的系统架构图:
其实还是蛮相似的,都有分层的概念。既然我们开发的软件系统能进行分层,那么MySQL
MySQL
peut être personnalisé, en utilisant le protocole GPL, vous pouvez modifier le code source pour développer votre propre MySQL
. 🎜🎜Veuillez noter
MySQL
orthographe, de plus, beaucoup de gens peuvent se demander pourquoiLe logo de MySQL
est un dauphin ? 🎜
MySQL
Schéma d'architecture global. 🎜Jetons un coup d'œil au diagramme d'architecture système que nous avons développé : 🎜
En fait, ils sont assez similaires. concept de superposition. Puisque le système logiciel que nous développons peut être superposé, alors MySQL Peut-il être superposé ? 🎜<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">La réponse est : Oui, parlons-en ci-dessous<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);famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>MySQL
La situation des couches et les fonctions de chaque couche. MySQL
的分层情况以及每一层的功能。
上面的架构图我们可以对其进行拆分,并做简要的说明。
与客户端打交道,上面已经写明了能支持的的语言。客户端的链接支持的协议很多,比如我们在 Java
开发中的 JDBC
。
这一层是不是有点像我们项目中的网关层
?如果对网关不熟悉,那我们可以理解我controller
JDBC
. Ce calque ne ressemble-t-il pas un peu à celui de notre projet ? : rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break -all;color: rgb(239, 112, 96);"> Couche passerelle contrôleurcouche. <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;"></p>🎜Couche de service🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜Cette couche est équivalente à la couche de service de notre système d'entreprise, un méli-mélo d'opérations commerciales associées, d'optimisation de code, de mise en cache, etc. 🎜🎜🎜🎜Connection pool🎜🎜🎜🎜 est principalement responsable du stockage et de la gestion de la connexion entre le client et la base de données, et un thread est responsable de la gestion d'une connexion. Depuis l'introduction du pool de connexions, rapports officiels : Lorsque le nombre de connexions à la base de données atteint 128, les performances d'utilisation du pool de connexions et sans pool de connexions sont améliorées de n fois (de toute façon, les performances sont grandement améliorées). 🎜<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Une fois la connexion établie, vous pouvez exécuter l'instruction select. La logique d'exécution viendra d'abord au module de cache. </p>
<h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">
<span style="display: none;"></span>Cache<span style="display: none;"></span>
</h3>
<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Une fois que MySQL a reçu une requête de requête, il ira d'abord dans le cache de requêtes pour voir si cette instruction a déjà été exécutée. Les instructions précédemment exécutées et leurs résultats sont stockés en mémoire sous forme de paires clé-valeur. La clé est l'instruction de requête et la valeur est le résultat de la requête. Si votre requête parvient à trouver la clé directement dans ce cache (hit), alors la valeur sera renvoyée directement au client. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">S'il y a un échec dans le cache, la phase d'exécution suivante se poursuivra. Une fois l'exécution terminée, les résultats de l'exécution seront stockés dans le cache des requêtes. Comme vous pouvez le voir ici, si la requête atteint le cache, MySQL peut renvoyer directement le résultat sans effectuer d'opérations complexes ultérieures, ce qui est très efficace. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Mais dans la plupart des cas, je vous recommanderais de ne pas utiliser la mise en cache des requêtes, pourquoi ? Parce que la mise en cache des requêtes fait souvent plus de mal que de bien. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Le cache de requêtes échoue très fréquemment. Tant qu'une certaine donnée d'une table est mise à jour, tous les caches de requêtes sur cette table seront effacés. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Vous aurez peut-être du mal à sauvegarder les résultats, mais avant de les utiliser, ils seront effacés par une mise à jour. Pour les bases de données soumises à une forte pression de mise à jour, le taux de réussite du cache de requêtes sera très faible. A moins que votre entreprise ne dispose d’un tableau statique qui ne sera mis à jour qu’une fois de longue durée. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Par exemple : une table de configuration système, alors la requête sur cette table est adaptée au cache de requêtes. </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Heureusement <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 break-all rgb>MySQL
fournit également ce A " utiliser selon les besoins ». Vous pouvez définir les paramètres query_cache_type
est défini sur DEMAND
, pour que les instructions SQL par défaut soient non utilisé Cache de requêtes. MySQL
也提供了这种“按需使用”的方式。你可以将参数query_cache_type
设置成DEMAND
,这样对于默认的SQL语句都不使用查询缓存。
「注意」:MySQL 8.0
La version MySQL 8.0
supprime directement toute la fonction de cache de requêtes, ce qui indique que MySQL 8.0 a complètement éliminé la fonction de cache. Après avoir terminé l'analyse lexicale, vous devez faire une "analyse grammaticale". Sur la base des résultats de l'analyse lexicale, l'analyseur de syntaxe déterminera si l'instruction SQL que vous avez saisie satisfait à la syntaxe MySQL en fonction des règles grammaticales.
Si nous manquons ou écrivons une mauvaise lettre lors de l'orthographe SQL, nous recevrons un rappel d'erreur de "You have an error in your SQL syntax
".
Par exemple, dans le cas suivant :
L'erreur est qu'il manque un E dans le mot clé WHERE.
De même, nous utilisons SQL si un champ n'existe pas.
Généralement, les erreurs grammaticales apparaîtront au premier endroit où l'erreur se produit, vous devez donc faire attention au contenu immédiatement après « utiliser à proximité ». Ceci est à titre de référence uniquement. Parfois, cette invite n'est pas très fiable. .
Le SQL a été analysé par l'analyseur et aucune erreur n'a été signalée. Entrez ensuite dans l'optimiseur à ce moment pour optimiser le SQL.
L'optimiseur est principalement utilisé pour décider quel index utiliser s'il y a plusieurs index dans notre table de base de données ou lorsqu'une instruction a plusieurs associations de tables (jointures), déterminer l'ordre de jointure de chaque table ;
Par exemple :
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
Cela optimisera la requête conditionnelle.
Une fois le traitement de l'optimiseur terminé, le plan d'exécution SQL a été déterminé. Continuez ensuite dans l'actionneur.
Tout d'abord, vous devez déterminer les autorisations, c'est-à-dire si vous avez l'autorisation d'exécuter ce SQL. Les autorisations peuvent être contrôlées sur certains clients pendant le travail.
Par exemple : dans l'environnement de production, la plupart des développeurs ne disposent que d'autorisations de requête et aucune autorisation d'ajout, de suppression ou de modification (sauf pour certaines petites entreprises).
Si vous avez la permission, ouvrez la table et poursuivez l'exécution. Lorsqu'une table est ouverte, l'exécuteur utilisera l'interface fournie par le moteur en fonction de la définition du moteur de la table.
Cette couche peut être comprise comme la couche de persistance dans notre système métier.
Le concept de moteur de stockage est propre à MySQL. Toutes les bases de données relationnelles n'ont pas le concept de moteur de stockage.
Le moteur de stockage de base de données est l'organisation logicielle sous-jacente de la base de données. Le système de gestion de base de données (SGBD) utilise le moteur de données pour créer, interroger, mettre à jour et supprimer des données. Différents moteurs de stockage fournissent différents mécanismes de stockage, techniques d'indexation, niveaux de verrouillage et autres fonctions. En utilisant différents moteurs de stockage, vous pouvez également obtenir des fonctions spécifiques. De nombreux systèmes de gestion de bases de données prennent aujourd’hui en charge une variété de moteurs de données différents.
Les données étant stockées sous forme de table dans une base de données relationnelle, le moteur de stockage peut également être appelé type de table (Table Type, c'est-à-dire le type de stockage et de fonctionnement de cette table).
Ce qui suit est une comparaison de certains moteurs relativement couramment utilisés :
Dans les projets réels, la plupart utilisent au moins InnoDB, puis MyISAM et d'autres moteurs de stockage.
Nous pouvons utiliser la commande pour voir les moteurs de stockage fournis par MySQL :
show engies;
Nous pouvons également utiliser la commande pour afficher le moteur de stockage par défaut actuel de MySQL :
afficher les variables comme '%storage_engine%';
MyISAM
et InnoDB
MyISAM
与 InnoDB
引擎的区别MySQL
Assistance La lecture multiversion
prend en charge les verrous au niveau des lignes
Le blocage en lecture et en écriture est lié au niveau d'isolation des transactions
Prend en charge la mise en cache, qui peut mettre en cache à la fois les index et les données
La table entière et les clés primaires sont stockées en mode Cluster pour former un arbre équilibré
Bien sûr que non On dit qu'InnoDB doit être bon. Dans le développement réel, vous devez toujours choisir d'utiliser InnoDB ou MyISAM en fonction de scénarios spécifiques.
MyIASM (ce moteur était le moteur de stockage par défaut dans les bases de données MySQL avant 5.5) Caractéristiques :
MyISAM ne prend pas en charge les transactions de base de données
Rangée non prise en charge -verrous de niveau et clés étrangères
En raison de 2, lors de l'exécution d'une instruction d'insertion INSERT ou de mise à jour UPDATE, c'est-à-dire lors de l'exécution d'une opération d'écriture, la table entière doit être verrouillée, donc l'efficacité sera réduit
MyISAM enregistre le nombre de lignes dans le tableau Lors de l'exécution de SELECT COUNT(*) FROM TABLE
, les valeurs pertinentes peuvent être lues directement sans analyser l'intégralité du tableau, ce qui est rapide.
La différence entre les deux :
MyISAM est sécurisé pour les transactions
MyISAM La granularité des verrous est au niveau de la table et InnoDB prend en charge le niveau de la ligne serrures
MyISAM prend en charge les index de texte intégral, tandis qu'InnoDB ne prend pas en charge les index de texte intégral avant MySQL5.6. Il prend en charge les index FULLTEXT à partir de MySQL5.6.
Comparaison des scénarios d'utilisation :
Si vous souhaitez effectuer un grand nombre d'opérations sélectionnées, vous devez choisir MyISAM
Si vous voulez jouer un grand nombre d'insertions et d'ups Pour les opérations de date, InnoDB doit être sélectionné
Les ensembles de données de grande taille ont tendance à choisir le moteur InnoDB car il prend en charge le traitement des transactions et la récupération après échec. La taille de la base de données détermine la durée du temps de récupération après panne. InnoDB peut utiliser les journaux de transactions pour la récupération des données, ce qui est plus rapide. Les requêtes de clé primaire seront également assez rapides sous le moteur InnoDB, mais il convient de noter que si la clé primaire est trop longue, cela entraînera également des problèmes de performances.
Relativement parlant, InnoDB est davantage utilisé par les sociétés Internet.
Cette couche peut également être comprise comme la base de données de notre système d'entreprise.
La couche de stockage des fichiers système est principalement responsable du stockage des données de la base de données et des journaux dans les fichiers système, tout en complétant la transaction avec le moteur de stockage. Il s'agit de la couche de stockage physique des fichiers.
Par exemple : fichiers de données, fichiers journaux, fichiers pid, fichiers de configuration, etc.
"fichier db.opt" : Enregistrez le jeu de caractères par défaut et les règles de vérification de cette base de données.
"fichier frm" : informations de métadonnées stockées dans le bord, y compris les informations de définition de la structure de la table, etc. Chaque table aura un fichier frm qui lui correspond.
"Fichier MYD" : Un fichier dédié au moteur de stockage MyISAM, qui stocke les informations de données de la table MyISAM. Chaque table MyISAM possède un fichier .MYD.
「MYI文件」:也是MyISAM存储引擎专用的文件,存放MyISAM表的索引相关信息,每一张MyISAM表都有对应的.MYI文件。
「ibd文件和ibdata文件」:存放InnoDB的数据文件(包括索引)。InnoDB存储引擎有两种表空间方式:独立表空间和共享表空间。
「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查询流程图
MySQL
Nous pouvons considérer l'ensemble du système comme un système logiciel que nous développons quotidiennement. Il dispose également d'une couche d'accès, conçue pour se connecter aux clients externes. Elle est très similaire à la passerelle de notre système, et le cache est similaire à celui de notre code métier.Le cache et l'analyseur utilisés peuvent être compris comme l'analyse des paramètres et la vérification des paramètres dans le système métier.La couche d'optimisation peut être utilisée comme moyen pour nous de développer l'optimisation du code. Le moteur est équivalent à notre couche de persistance et le système de fichiers est équivalent à l'ensemble de la base de données du système d'entreprise. MySQL
整个系统我们可以看成是我们日常开发的软件系统,也有接入层,专门对接外面客户端的,和我们系统的网关就很像,缓存也就类似我们业务代码中使用的缓存,解析器可以理解为业务系统中参数解析以及参数校验,优化层可以当做我们开发代码优化的手段,然后存储引擎就相当于我们的持久层,文件系统相当于整个业务系统中的数据库。
可能比喻不是非常的恰当,但是希望大家能领略轻重的含义,目的只有一个,那就是让大家能轻松掌握MySQL
Peut-être que la métaphore n'est pas très appropriée, mais j'espère que tout le monde pourra comprendre le sens de la gravité. Il n'y a qu'un seul but, qui est de permettre à tout le monde de la saisir facilementSituation globale de MySQL
.
Certaines images de l'article proviennent d'Internet et ont été supprimées !
N'enviez pas chaque jour des gens formidables ou de grands dieux, ils sont aussi venus étape par étape. Soyez confiant, tant que vous le faites petit à petit et que vous travaillez terre-à-terre, vous deviendrez un grand maître.
Lecture recommandée
Si tu ne bouges pas, je ne bougerai pas --- Mode Observateur
Résumé des entretiens avec 4 entreprises en 10 jours après la démission
Le dos L'interview de fin a coûté 230 000 yuans et plus de 500 pages, ce qui est génial !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!