base de données
tutoriel mysql
Comment l'instruction de requête select est-elle exécutée dans l'apprentissage MySQL ?
Comment l'instruction de requête select est-elle exécutée dans l'apprentissage MySQL ?
Cet article vous apporte des connaissances pertinentes sur l'exécution d'instructions sélectionnées dans MySQL, y compris les connecteurs, les analyseurs, les optimiseurs et les exécuteurs. J'espère qu'il vous sera utile.

En tant que base de données relationnelle, MySQL devrait être la plus utilisée en Chine. Peut-être que votre entreprise utilise Oracle, PG, etc., mais la plupart des sociétés Internet, comme la nôtre, utilisent le plus Mysql, et son importance est évidente.
Exécutez select * from table, que se passe-t-il exactement en bas de la base de données ? Alors, comment obtenons-nous les données ?
Supposons maintenant que j'ai une table utilisateur avec seulement deux colonnes, une colonne a un identifiant auto-croissant et une colonne a un nom de type varchar. L'instruction de création de table est la suivante :
CREATE TABLE IF NOT EXISTS `user`( `id` INT UNSIGNED AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Le problème est le processus d'exécution de l'instruction suivante.
select * from user where id = 1;
01 Présentation de l'architecture mysql
Pour comprendre ce problème, vous devez connaître l'architecture interne de mysql. À cette fin, j'ai dessiné un diagramme d'architecture MySQL (vous pouvez également le comprendre comme le processus d'exécution des instructions de requête SQL), comme indiqué ci-dessous :

Tout d'abord, msql est divisé en deux parties : la couche serveur et la couche moteur de stockage. La couche serveur comprend quatre modules fonctionnels : connecteur, cache de requêtes, optimiseur et exécuteur. Cette couche est responsable de tout le travail de base de MySQL, tel que les fonctions intégrées, les procédures stockées, les déclencheurs, les vues, etc.
La couche moteur de stockage est responsable de l'accès aux données. Notez que le moteur de stockage est facultatif dans MySQL. Les moteurs courants incluent : InnoDB, MyISAM et Memory, etc. Le plus couramment utilisé est InnoDB. C'est également le moteur de stockage par défaut désormais (à partir de la version 5.5.5 de MySQL. Vous pouvez voir que ma déclaration de création de table ci-dessus a spécifié le moteur InnoDB). Bien sûr, il sera utilisé par défaut si vous ne le spécifiez pas.
Le moteur de stockage étant facultatif, tous les moteurs de stockage de MySQL partagent en fait une couche serveur. Revenons au sujet, utilisons le processus présenté dans cette image pour résoudre le problème du peu de graisse.
Connecteur 1.1
Tout d'abord, si la base de données veut exécuter SQL, elle doit d'abord être connectée à la base de données. Cette partie du travail est effectuée par le connecteur. Il est chargé de vérifier les mots de passe des comptes, d'obtenir les autorisations, de gérer le nombre de connexions et enfin d'établir les connexions avec les clients. La base de données de liens mysql s'écrit comme ceci :
mysql -h 127.0.0.1 -P 3306 -u root -p # 127.0.0.1 : ip 3306 : 端口 root : 用户名
Après avoir exécuté la commande, vous devez entrer le mot de passe, bien sûr, vous pouvez également suivre -p. Cependant, cela n’est pas recommandé car il existe un risque de fuite de mot de passe.
Après avoir entré la commande, le connecteur vérifie votre identité en fonction de votre nom de compte et de votre mot de passe. Il y aura deux situations :
Le compte ou le mot de passe est incorrect et le serveur renverra "ERREUR 1045 (28000) : Accès refusé pour l'utilisateur 'root'@'127.0.0.1' (en utilisant le mot de passe : OUI)" Erreur , quittez la connexion.
Une fois la vérification réussie, le connecteur ira à la table des autorisations pour vérifier vos autorisations. Les autorisations dont vous disposerez plus tard seront jugées par les autorisations lues à ce moment-là.
Remarque, je parle des autorisations trouvées à ce moment. Même si vous utilisez le compte administrateur pour modifier les autorisations de l'utilisateur actuel, l'utilisateur actuellement connecté ne sera pas affecté. Vous devez redémarrer MySQL pour que les nouvelles autorisations prennent effet.
1.1.1 Vérifier l'état de la connexion
La connexion est terminée. Si rien n'est fait par la suite, la connexion sera dans un état inactif. Vous pouvez utiliser la commande show processlist; pour afficher les informations de connexion de mysql, comme indiqué ci-dessous. Toutes mes connexions à la base de données sont en état de veille, à l'exception des connexions qui effectuent l'opération show processlist.

1.1.2 Connexion de contrôle
Si le client ne fonctionne pas trop longtemps, cette connexion sera automatiquement déconnectée. Ce temps est par défaut de 8 heures et est contrôlé par le paramètre wait_timeout. Si vous continuez à fonctionner après la déconnexion, vous recevrez l'erreur « Connexion perdue au serveur MySQL lors de la requête ». A ce moment, vous devez vous reconnecter pour exécuter la requête.
Il existe des connexions longues et courtes dans la base de données. Connexion longue : s'il y a des demandes continues une fois la connexion réussie, la même connexion sera toujours utilisée. Connexion courte : la connexion est déconnectée après l'exécution de plusieurs requêtes et devra être rétablie la prochaine fois.
L'établissement d'une connexion étant une opération fastidieuse, il est recommandé d'utiliser une connexion longue. Mais il y a un problème. Si une longue connexion reste connectée, elle occupera trop de mémoire et sera automatiquement supprimée par le système. Cela provoque un redémarrage anormal de MySQL. Comment le résoudre ? Deux méthodes :
Déconnectez régulièrement les connexions longues. Utilisez une heure spécifique, ou le programme détermine que la connexion est déconnectée après avoir effectué une opération qui occupe beaucoup de mémoire. Reconnectez-vous si nécessaire.
mySQL 5.7 ou supérieur, vous pouvez exécuter mysql_reset_connection pour reconnecter la ressource après chaque exécution d'une opération qui prend beaucoup de mémoire. À ce stade, il n'est pas nécessaire de se reconnecter ou d'effectuer à nouveau une authentification d'autorisation, mais la connexion. le statut sera restauré à l’état précédent une fois créé.
1.2 查询缓存
连接建立以后可以执行 select 语句了。这就会来到第二步:查询缓存。
查询缓存中存储的数据是 key-value 的形式,key 是查询语句,value 是查询的结果。逻辑是这样的:先看看查询缓存有没该语句对应的 value?有则直接取出返回客户端,无则继续到数据库执行语句。查出结果后会放一份到缓存中,再返回客户端。
你可能发现缓存真的香,但是并不建议使用查询缓存,因为有弊端。查询缓存的失效非常频繁,只有某个表有更新。它马上失效了,对于经常更新的表来说,命中缓存的概率极低。它仅仅适用于那些不经常更新的表。
而 MySQL 似乎也考虑到这点了。提供了 query_cache_type 参数,把它设置为 DEMAND 就不再适用韩村。而对于要使用缓存的语句则可用 SQL_CACHE 显示指定,像这样:
select SQL_CACHE * from user where id = 1;
PS:MySQL 8.0 及以上版本把查询缓存删掉了,之后再也没有这块功能了。
1.3 分析器
如果没有命中缓存就进入分析器,这里就是对 sql 进行分析。分析器会做词法分析。你输入的 sql 是啥,由啥组成,MySQL 都需要知道它们代表什么。
首先根据 "select" 识别出这是查询语句。字符串"user"识别成"表名 user"、字符串"id"识别成"列名id"。
之后进行语法分析,它会根据输入的语句分析是不是符合 MySQL 的语法。具体表现就是 select、where、from 等关键字少了个字母,明显不符合 MySQL 语法,这次就会报个语法错误的异常:它一般会提示错误行数,关注"use near"后面即可。

1.4 优化器
过了分析器,就来到了优化器。MySQL 是个聪明的仔,再执行之前会自己优化下客户端传过来的语句,看看那种执行起来不那么占内存、快一点。比如下面的 sql 语句:
select * from user u inner join role r on u.id = r.user_id where u.name = "狗哥" and r.id = 666
它可以先从 user 表拿出 name = "狗哥" 记录的 ID 值再跟 role 表内连接查询,再判断 role 表里面 id 的值是否 = 666
也可以反过来:先从 role 表拿出 id = 666 记录的 ID 值再跟 user 表内连接查询,在判断 user 表里面的 name 值是否 = "狗哥"。
两种方案的执行结果是一样的,但是效率不一样、占用的资源也就不一样。优化器就是在选择执行的方案。它优化的是索引应该用哪个?多表联查应该先查哪个表?怎么连接等等。
1.5 执行器
分析器知道了做啥、优化器知道了应该怎么做。接下来就交给执行器去执行了。
开始执行,判断是否有相应的权限。比如该账户对 user 表没权限就返回无权限的错误,如下所示:
select * from user where id = 1; ERROR 1142 (42000): SELECT command denied to user 'nasus'@'localhost' for table 'user'
PS:如果命中缓存没走到执行器这里,那么在返回查询结果时做权限验证。
回到正题,如果有权限,继续打开表执行。执行器会根据表定义的引擎去使用对应接口。比如我们上面的 sql 语句执行流程是这样的:
走 id 索引、调用 InnoDB 引擎取"满足条件的第一行"接口,再循环调用"满足条件的下一行"接口(这些接口都是存储引擎定义好的),直到表中不再有满足条件的行。执行器就将上述遍历得到的行组成结果集返回给客户端。
对于 id 不是索引的表,执行器只能调用"取表记录的第一行"接口,再判断 id 是否 = 1。如果不是则跳过,是则存在结果集中;再调存储引擎接口取"下一行",重复判断逻辑,直到表的最后一行。
至此,整个 SQL 的执行流程完毕,
推荐学习:mysql视频教程
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!
Outils d'IA chauds
Undress AI Tool
Images de déshabillage gratuites
Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes
AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.
Clothoff.io
Dissolvant de vêtements AI
Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !
Article chaud
Outils chauds
Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit
SublimeText3 version chinoise
Version chinoise, très simple à utiliser
Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP
Dreamweaver CS6
Outils de développement Web visuel
SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)
Sujets chauds
Effectuer des sauvegardes logiques à l'aide de mysqldump dans MySQL
Jul 06, 2025 am 02:55 AM
MySQLDump est un outil commun pour effectuer des sauvegardes logiques des bases de données MySQL. Il génère des fichiers SQL contenant des instructions de création et d'insertion pour reconstruire la base de données. 1. Il ne sauvegarde pas le fichier d'origine, mais convertit la structure de la base de données et le contenu en commandes SQL portables; 2. Il convient aux petites bases de données ou à la récupération sélective et ne convient pas à la récupération rapide des données de niveau TB; 3. 4. Utilisez la commande MySQL pour importer pendant la récupération et peut désactiver les vérifications des clés étrangères pour améliorer la vitesse; 5. Il est recommandé de tester régulièrement la sauvegarde, d'utiliser la compression et de régler automatiquement.
Configuration de la réplication asynchrone primaire-replica dans MySQL
Jul 06, 2025 am 02:52 AM
Pour configurer la réplication maître-esclave asynchrone pour MySQL, suivez ces étapes: 1. Préparez le serveur maître, activez les journaux binaires et définissez un serveur unique, créez un utilisateur de réplication et enregistrez l'emplacement du journal actuel; 2. Utilisez MySQLDump pour sauvegarder les données de la bibliothèque maître et l'importez-les au serveur esclave; 3. Configurez le serveur-ID et le log-log du serveur esclave, utilisez la commande Changemaster pour vous connecter à la bibliothèque maître et démarrer le thread de réplication; 4. Vérifiez les problèmes communs, tels que le réseau, les autorisations, la cohérence des données et les conflits d'auto-augmentation, et surveiller les retards de réplication. Suivez les étapes ci-dessus pour vous assurer que la configuration est terminée correctement.
Implémentation de transactions et compréhension des propriétés acides dans MySQL
Jul 08, 2025 am 02:50 AM
MySQL prend en charge le traitement des transactions et utilise le moteur de stockage InNODB pour garantir la cohérence et l'intégrité des données. 1. Les transactions sont un ensemble d'opérations SQL, soit tous réussissent ou ne parviennent pas à reculer; 2. Les attributs acides comprennent l'atomicité, la cohérence, l'isolement et la persistance; 3. Les déclarations qui contrôlent manuellement les transactions sont StartTransaction, Commit and Rollback; 4. Les quatre niveaux d'isolement incluent la lecture non engagée, la lecture soumise, la lecture reproductible et la sérialisation; 5. Utilisez correctement les transactions pour éviter le fonctionnement à long terme, désactiver les validations automatiques et gérer raisonnablement les verrous et les exceptions. Grâce à ces mécanismes, MySQL peut obtenir une forte fiabilité et un contrôle simultané.
Gestion des ensembles de personnages et des problèmes de collations dans MySQL
Jul 08, 2025 am 02:51 AM
Les problèmes de règles de jeu de caractères et de tri sont courants lors de la migration multiplateforme ou du développement multi-personnes, entraînant un code brouillé ou une requête incohérente. Il existe trois solutions principales: d'abord, vérifiez et unifiez le jeu de caractères de la base de données, de la table et des champs vers UTF8MB4, affichez via ShowCreateDatabase / Table, et modifiez-le avec une instruction alter; Deuxièmement, spécifiez le jeu de caractères UTF8MB4 lorsque le client se connecte et le définissez dans les paramètres de connexion ou exécutez SetNames; Troisièmement, sélectionnez les règles de tri raisonnablement et recommandez d'utiliser UTF8MB4_UNICODE_CI pour assurer la précision de la comparaison et du tri, et spécifiez ou modifiez-la via ALTER lors de la construction de la bibliothèque et du tableau.
Connexion à la base de données MySQL à l'aide du client de ligne de commande
Jul 07, 2025 am 01:50 AM
La façon la plus directe de se connecter à la base de données MySQL consiste à utiliser le client de la ligne de commande. Entrez d'abord le nom d'utilisateur MySQL-U -P et entrez correctement le mot de passe pour entrer l'interface interactive; Si vous vous connectez à la base de données distante, vous devez ajouter le paramètre -H pour spécifier l'adresse hôte. Deuxièmement, vous pouvez directement passer à une base de données spécifique ou exécuter des fichiers SQL lors de la connexion, tels que le nom de la base de données MySQL-U Username-P ou le nom de la base de données MySQL-U Username-P-P
Gérer les jeux de caractères et les collations dans MySQL
Jul 07, 2025 am 01:41 AM
Le réglage des jeux de caractères et des règles de collation dans MySQL est crucial, affectant le stockage des données, l'efficacité de la requête et la cohérence. Premièrement, le jeu de caractères détermine la gamme de caractères storable, telle que UTF8MB4 prend en charge les chinois et les emojis; Les règles de tri contrôlent la méthode de comparaison des caractères, telle que UTF8MB4_UNICODE_CI est sensible à la casse, et UTF8MB4_BIN est une comparaison binaire. Deuxièmement, le jeu de caractères peut être défini à plusieurs niveaux de serveur, de base de données, de table et de colonne. Il est recommandé d'utiliser UTF8MB4 et UTF8MB4_UNICODE_CI de manière unifiée pour éviter les conflits. En outre, le problème du code brouillé est souvent causé par des jeux de caractères incohérents de connexions, de stockage ou de terminaux de programme, et doit être vérifié par calque par calque et définir uniformément. De plus, les ensembles de caractères doivent être spécifiés lors de l'exportation et de l'importation pour éviter les erreurs de conversion
Concevoir une stratégie de sauvegarde de la base de données MySQL robuste
Jul 08, 2025 am 02:45 AM
Pour concevoir une solution de sauvegarde MySQL fiable, 1. Premièrement, clarifiez les indicateurs RTO et RPO, et déterminez la fréquence et la méthode de sauvegarde en fonction de la plage de temps d'arrêt et de perte de données acceptable de l'entreprise; 2. Adoptez une stratégie de sauvegarde hybride, combinant une sauvegarde logique (comme MySQLDump), une sauvegarde physique (telle que Perconaxtrabackup) et un journal binaire (binlog), pour obtenir une récupération rapide et une perte de données minimale; 3. Testez régulièrement le processus de récupération pour assurer l'efficacité de la sauvegarde et familiariser avec les opérations de récupération; 4. Faites attention à la sécurité du stockage, y compris le stockage hors site, la protection du chiffrement, la politique de rétention de version et la surveillance des tâches de sauvegarde.
En utilisant des expressions de table communes (CTES) dans MySQL 8
Jul 12, 2025 am 02:23 AM
Les CTES sont une fonctionnalité introduite par MySQL8.0 pour améliorer la lisibilité et la maintenance des requêtes complexes. 1. CTE est un ensemble de résultats temporaire, qui n'est valable que dans la requête actuelle, a une structure claire et prend en charge les références en double; 2. Comparé aux sous-requêtes, le CTE est plus lisible, réutilisable et prend en charge la récursivité; 3. Le CTE récursif peut traiter les données hiérarchiques, telles que la structure organisationnelle, qui doit inclure des requêtes initiales et des pièces de récursivité; 4. Les suggestions d'utilisation incluent l'évitement de l'abus, la dénomination des spécifications, la prête d'attention aux performances et aux méthodes de débogage.


