Maison > Article > base de données > Quel est l’ensemble du processus d’exécution d’une instruction dans Mysql ?
L'architecture logique de Mysql est la suivante L'ensemble est divisé en deux parties, la couche Serveur et la couche moteur de stockage.
Les opérations non liées au moteur de stockage sont effectuées au niveau de la couche serveur, et la couche moteur de stockage est responsable de l'accès aux données.
Ce qui suit présentera le rôle de chaque étape selon le processus dans la figure ci-dessus. Ici, nous prenons l'interrogation d'un enregistrement comme exemple.
Cette étape sert principalement à gérer les connexions et la vérification des autorisations.
est responsable de la gestion de la connexion du client, comme mysql -u root -p
, qui se fait entre le client et le connecteur. La connexion est divisée en connexion longue et. connexion courte. Il est recommandé d'utiliser des connexions longues car l'établissement d'une connexion est un processus relativement compliqué. Cependant, les connexions longues peuvent également être optimisées, c'est-à-dire que s'il y a trop de connexions longues, davantage de mémoire sera occupée à mesure que des opérations de requête volumineuses seront exécutées. mysql -u root -p
,就是客户端与连接器之间完成的,连接分为长连接和短连接,建议使用长连接,因为建立连接是相对复杂的一个过程。但是长连接也有优化的空间,即长连接过多,随着执行大的查询操作,会占用较多的内存。
建立连接完成之后,连接器会判断该用户的权限,之后用户的操作都会基于权限来判定是否允许。
这一步主要是词法分析和语法分析。
词法分析主要是判定用户想做什么,比如select 就是想要查询。
语法分析主要是判定用户输入的SQL是否符合Mysql的语法。
经过分析器,Mysql已经知道用户想要干什么了,但是对于相同的一条SQL语句,对于Mysql具体实施的时候,可能有多种方法去实现,效率也就不一样。
在优化器这一步,mysql需要判定怎么样执行才是最优的效率。
这一步主要是操作引擎和返回结果。操作存储引擎层以遍历数据表,查找符合条件的数据并将其返回给客户端。
与一条SQL查询语句相同的是,在Mysql中同样要经过连接器、分析器、优化器、执行器,也要用到存储引擎来进行数据的存取。
不同的是,更新语句需要涉及到两个重要的日志模块,redo log和binlog
一家饭店生意红火,但作为一家饭店来说,免不了每天都有赊账和来还账的。
如果有大量的赊账和还账的人,老板将无法用一块粉板来记录一个月的赊账记录。
所以老板想到可以把所有的赊账记录写到账本上,而粉板上写的都是短时间的,等下班了之后,拿粉板上的和账本进行对账。
在这个例子中,粉板就是redo log
,账本就是mysql中的记录,我们用还账类比一下mysql的更新过程,如果每次有人更新,我们都去mysql
中找到这条记录,效率很低,所以mysql的思路和这个老板一致,更新操作先放到redo log
中,过一段时间再慢慢消化。
这种思路叫WAL技术,即Write Ahead Logging
技术,先写日志,再写磁盘。
老板必须停下手头的工作,如果粉板已经满了而且老板还没有下班。mysql中的redo log总共可以记录4GB的操作
当write pos 追上check point
,mysql这个老板就要去处理一下redo log了。
除此之外,有了redo log
持久化,数据库即使异常重启也不会丢日志,这是crash saf
La différence est que l'instruction de mise à jour doit impliquer deux modules de journalisation importants, redo log et binlog
7.redo log#🎜🎜 # L'activité d'un restaurant est en plein essor, mais en tant que restaurant, il est inévitable d'avoir des comptes créditeurs et des remboursements de dettes chaque jour.
S'il y a un grand nombre de personnes ayant des comptes créditeurs et des remboursements de dettes, le patron ne pourra pas utiliser un tableau rose pour enregistrer les relevés de crédit d'un mois.
Le patron a donc pensé à écrire tous les dossiers de crédit dans le grand livre, et ce qui est écrit sur le tableau rose est pour une courte période. Après avoir quitté le travail, utilisez le tableau rose pour rapprocher les. grand livre. #🎜🎜##🎜🎜#Dans cet exemple, le tableau rose estredo log
et le grand livre est l'enregistrement dans MySQL. Utilisons l'analogie du remboursement pour comparer le processus de mise à jour de MySQL si quelqu'un. mis à jour à chaque fois, nous allons tous sur mysql
pour trouver cet enregistrement, ce qui est très inefficace, donc l'idée de mysql est cohérente avec l'idée de ce patron. L'opération de mise à jour est d'abord mise dans redo logcode>, puis à nouveau après un certain temps. Digérez lentement. #🎜🎜##🎜🎜#Cette idée s'appelle la technologie WAL, qui est la technologie <code>Write Ahead Logging
Le journal est écrit en premier, puis le disque est écrit. #🎜🎜##🎜🎜#Le patron doit arrêter ce qu'il fait si le tableau rose est plein et que le patron n'a pas encore quitté le travail. Le redo log dans MySQL peut enregistrer un total de 4 Go d'opérations#🎜🎜##🎜🎜##🎜🎜##🎜🎜#Quand write pos rattrapera le check point
, le patron de MySQL devra s'occuper du refaire le journal. #🎜🎜##🎜🎜# De plus, avec la persistance redo log
, la base de données ne perdra pas de journaux même si elle redémarre anormalement. Il s'agit du mécanisme de sécurité en cas de crash
, mais il convient tout de même de noter que le journal redo est unique au moteur de stockage innodb. #🎜🎜##🎜🎜#8.bin log#🎜🎜##🎜🎜#binlog est un journal de couche serveur et peut être appliqué à tous les moteurs de stockage. #🎜🎜##🎜🎜#Donc, puisqu'il existe un binlog, pourquoi avons-nous dû créer un redo log exclusif au moteur de stockage innodb ? #🎜🎜##🎜🎜#Parce que mysql n'avait pas de moteur innodb au début, mais le moteur myisam, qui utilisait binlog, mais le binlog était limité à l'archivage et n'avait pas de mécanisme anti-crash, j'ai donc ajouté une refonte enregistrer. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#redo log est unique au moteur de stockage innodb, tandis que binlog est unique à la couche serveur #🎜🎜##🎜🎜##🎜🎜##🎜🎜# redo log Ce qui est stocké est le journal physique, et le binlog est le journal logique #🎜🎜##🎜🎜##🎜🎜##🎜🎜#redo log, comme mentionné ci-dessus, prend en charge une taille de 4 Go. doit être traité et écrasé. Le journal binlog doit être Après qu'un fichier journal #🎜🎜##🎜🎜##🎜🎜##🎜🎜# soit rempli, un nouveau fichier journal sera créé. #🎜🎜##🎜🎜##🎜🎜#Ce qui suit prend comme exemple la mise à jour d'une ligne de données avec l'ID 2 : #🎜🎜##🎜🎜##🎜🎜#La boîte lumineuse dans l'image indique qu'il est exécuté dans InnoDB, et la case sombre La case colorée indique l'exécution dans l'exécuteur. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#L'exécuteur cherche d'abord le moteur pour obtenir la ligne ID=2. L'ID est la clé primaire et le moteur utilise directement la recherche arborescente pour trouver cette ligne. Si la page de données où se trouve la ligne avec ID=2 est déjà dans la mémoire, elle sera renvoyée directement à l'exécuteur sinon, elle doit d'abord être lue dans la mémoire à partir du disque puis renvoyée ;
L'exécuteur récupère les données de ligne fournies par le moteur, ajoute 1 à cette valeur, par exemple, c'était N avant, mais maintenant c'est N+1, obtient une nouvelle ligne de données, puis appelle le moteur interface pour écrire cette nouvelle ligne de données.
Le moteur met à jour cette nouvelle ligne de données dans la mémoire et enregistre l'opération de mise à jour dans le journal redo. À ce moment, le journal redo est à l'état de préparation. Informez ensuite l'exécuteur testamentaire que l'exécution est terminée et que la transaction peut être soumise à tout moment. Lors de l'exécution de l'opération, l'exécuteur génère un binlog et l'écrit sur le disque.
L'exécuteur appelle l'interface de transaction de validation du moteur, et le moteur modifie le journal de rétablissement qui vient d'être écrit en état de validation, et la mise à jour est terminée.
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!