Maison  >  Article  >  base de données  >  Analyse approfondie du processus d'exécution de SQL dans MySQL (combinaison d'images et de texte)

Analyse approfondie du processus d'exécution de SQL dans MySQL (combinaison d'images et de texte)

青灯夜游
青灯夜游avant
2021-10-14 18:44:513027parcourir

Cet article vous amènera à comprendre le processus d'exécution SQL dans MySQL et à voir comment MySQL exécute une instruction de requête ? J'espère que cela aidera tout le monde !

Analyse approfondie du processus d'exécution de SQL dans MySQL (combinaison d'images et de texte)

Pour un ingénieur de développement, je pense qu'il est très nécessaire de comprendre comment MySQL exécute une instruction de requête. [Recommandations associées : Tutoriel vidéo mysql]

Tout d'abord, nous devons comprendre à quoi ressemble l'architecture de MYSQL ? Parlons ensuite du processus d’exécution d’une instruction de requête ?

Architecture MYSQL

Regardons d'abord un schéma d'architecture, comme suit :

Analyse approfondie du processus dexécution de SQL dans MySQL (combinaison dimages et de texte)

Explication détaillée du module

  • Connecteur : utilisé pour prendre en charge l'interaction entre différents langages ​​et SQL, tels que PHP, Python, JDBC de Java ; Connector:用来支持各种语言和 SQL 的交互,比如 PHP,Python,Java 的 JDBC;

  • Management Serveices & Utilities:系统管理和控制工具,包括备份恢复、MySQL 复制、集群等;

  • Connection Pool:连接池,管理需要缓冲的资源,包括用户密码权限线程等等;

  • SQL Interface:用来接收用户的 SQL 命令,返回用户需要的查询结果 ;

  • Parser:用来解析 SQL 语句;

  • Optimizer:查询优化器;

  • Cache and Buffer:查询缓存,除了行记录的缓存之外,还有表缓存,Key 缓存,权限缓存等等;

  • Pluggable Storage Engines

Services et utilitaires de gestion : outils de gestion et de contrôle du système, y compris la sauvegarde et la restauration, la réplication MySQL, le clustering, etc. ;

Pool de connexions : pool de connexions, gère les ressources qui doivent être mises en mémoire tampon, y compris les threads d'autorisation de mot de passe utilisateur, etc. <p></p>

Interface SQL : utilisée pour recevoir la commande SQL de l'utilisateur et renvoie les résultats de la requête requis par l'utilisateur ; Analyse approfondie du processus dexécution de SQL dans MySQL (combinaison dimages et de texte)

Parser : utilisé pour analyser les instructions SQL ;

Optimizer : optimiseur de requêtes ;

Cache et Buffer : Cache de requêtes, en plus du cache d'enregistrement de lignes, il existe également un cache de table, un cache de clé, un cache d'autorisation, etc.

Moteurs de stockage enfichables : moteur de stockage de plug-in, qui fournit une API aux services. Utilisez des couches pour gérer des fichiers spécifiques.

La superposition d'architecture

divise MySQL en trois couches, la couche de connexion qui s'interface avec le client, la couche de service qui effectue réellement les opérations et la couche du moteur de stockage qui s'occupe du matériel.

Couche de connexion

Pour se connecter au port 3306 du serveur MySQL, notre client doit établir une connexion avec le serveur, puis gérer toutes les connexions, vérifier l'identité et les autorisations du client, ces fonctions sont dans la couche de connexion complété.

Analyse approfondie du processus dexécution de SQL dans MySQL (combinaison dimages et de texte)

Couche de service

La couche de connexion transmettra l'instruction SQL à la couche de service, qui comprend également une série de processus :

Par exemple, le jugement du cache de requête, l'appel de l'interface correspondante selon SQL et la lexicalisation de notre Instruction SQL et analyse grammaticale (comme comment identifier les mots-clés, comment identifier les alias, s'il y a des erreurs de grammaire, etc.).

    Ensuite, il y a l'optimiseur. La couche inférieure de MySQL optimisera nos instructions SQL selon certaines règles, et enfin les remettra à l'exécuteur pour exécution.
  • Moteur de stockage

Le moteur de stockage est l'endroit où nos données sont réellement stockées. MySQL prend en charge différents moteurs de stockage. Ensuite, il y a la mémoire ou le disque.

Processus d'exécution SQL

En prenant une instruction de requête comme exemple, regardons à quoi ressemble le flux de travail de MySQL.

select name from user where id=1 and age>20;

Tout d'abord, regardons une image. Le processus suivant est basé sur cette image :

Connexion

Pour faire fonctionner une base de données, la première étape pour un programme ou un outil est d'établir une connexion avec le base de données. 🎜🎜Il existe deux types de connexions dans la base de données : 🎜🎜🎜Connexion courte : Une connexion courte signifie qu'elle sera fermée immédiatement une fois l'opération terminée. 🎜🎜Connexion longue : une connexion longue peut être maintenue ouverte, réduisant ainsi la consommation de création et de libération de connexions côté serveur. Cette connexion peut également être utilisée lorsque des programmes ultérieurs y accèdent. 🎜🎜🎜Établir une connexion est assez compliqué. Vous devez d'abord envoyer une demande. Après avoir envoyé la demande, vous devez vérifier le mot de passe du compte. Après vérification, vous devez voir les autorisations dont vous disposez, donc pendant l'utilisation, essayez d'utiliser. longues connexions. 🎜🎜Garder une longue connexion consommera de la mémoire. Si la connexion est inactive pendant une longue période, le serveur MySQL sera déconnecté. Vous pouvez utiliser l'instruction SQL pour afficher l'heure par défaut : 🎜
show global variables like &#39;wait_timeout&#39;;
🎜Cette heure est contrôlée par wait_timeout, et la valeur par défaut est de 28 800 secondes, 8 heures. 🎜🎜Query Cache🎜🎜MySQL est livré avec un module de cache en interne. Après avoir exécuté la même requête, nous avons constaté que le cache ne prenait pas effet. Pourquoi ? Le cache de MySQL est désactivé par défaut. 🎜
show variables like &#39;query_cache%&#39;;
🎜Désactivé par défaut signifie qu'il n'est pas recommandé de l'utiliser. Pourquoi MySQL ne recommande-t-il pas d'utiliser son propre cache ? 🎜🎜Principalement parce que le cache intégré de MySQL a des scénarios d'application limités : 🎜🎜Le premier est qu'il exige que les instructions SQL soient exactement les mêmes, avec un espace supplémentaire au milieu, et que les lettres avec des lettres majuscules et minuscules différentes soient considéré comme différents SQL. 🎜

第二个是表里面任何一条数据发生变化的时候,这张表所有缓存都会失效,所以对于有大量数据更新的应用,也不适合。

所以缓存还是交给 ORM 框架(比如 MyBatis 默认开启了一级缓存),或者独立的缓存服务,比如 Redis 来处理更合适。

在 MySQL 8.0 中,查询缓存已经被移除了。

语法解析和预处理

为什么一条 SQL 语句能够被识别呢?假如随便执行一个字符串 hello,服务器报了一个 1064 的错:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'hello' at line 1

这个就是 MySQL 的解析器和预处理模块。

这一步主要做的事情是对语句基于 SQL 语法进行词法和语法分析和语义的解析。

词法解析

词法分析就是把一个完整的 SQL 语句打碎成一个个的单词。

比如一个简单的 SQL 语句:select name from user where id = 1 and age &gt;20;

Analyse approfondie du processus dexécution de SQL dans MySQL (combinaison dimages et de texte)

它会将 select 识别出来,这是一个查询语句,接下来会将 user 也识别出来,你是想要在这个表中做查询,然后将 where 后面的条件也识别出来,原来我需要去查找这些内容。

语法分析

语法分析会对 SQL 做一些语法检查,比如单引号有没有闭合,然后根据 MySQL 定义的语法规则,根据 SQL 语句生成一个数据结构。这个数据结构我们把它叫做解析树(select_lex)。

就比如英语里面的语法 “我用 is , 你用 are ”这种,如果不对肯定是不可以的,语法分析之后发现你的 SQL 语句不符合规则,就会收到 You hava an error in your SQL syntax 的错误提示。

预处理器

如果写了一个词法和语法都正确的 SQL,但是表名或者字段不存在,会在哪里报错? 是在数据库的执行层还是解析器?比如:select * from hello;

还是在解析的时候报错,解析 SQL 的环节里面有个预处理器。它会检查生成的解析树,解决解析器无法解析的语义。比如,它会检查表和列名是否存在,检查名字和别名, 保证没有歧义。预处理之后得到一个新的解析树。

查询优化器

一条SQL语句是不是只有一种执行方式?或者说数据库最终执行的SQL是不是就是我们发送的 SQL?

这个答案是否定的。一条 SQL 语句是可以有很多种执行方式的,最终返回相同的结果,他们是等价的。但是如果有这么多种执行方式,这些执行方式怎么得到的?最终选择哪一种去执行?根据什么判断标准去选择?

这个就是 MySQL 的查询优化器的模块(Optimizer)。 查询优化器的目的就是根据解析树生成不同的执行计划(Execution Plan),然后选 择一种最优的执行计划,MySQL 里面使用的是基于开销(cost)的优化器,那种执行计划开销最小,就用哪种。

可以使用这个命令查看查询的开销:

show status like &#39;Last_query_cost&#39;;

MySQL 的优化器能处理哪些优化类型呢?

举两个简单的例子:

1、当我们对多张表进行关联查询的时候,以哪个表的数据作为基准表。

2、有多个索引可以使用的时候,选择哪个索引。

实际上,对于每一种数据库来说,优化器的模块都是必不可少的,他们通过复杂的算法实现尽可能优化查询效率的目标。但是优化器也不是万能的,并不是再垃圾的 SQL 语句都能自动优化,也不是每次都能选择到最优的执行计划,大家在编写 SQL 语句的时候还是要注意。

执行计划

优化器最终会把解析树变成一个执行计划(execution_plans),执行计划是一个数据结构。当然,这个执行计划不一定是最优的执行计划,因为 MySQL 也有可能覆盖不到所有的执行计划。

我们怎么查看 MySQL 的执行计划呢?比如多张表关联查询,先查询哪张表?在执行查询的时候可能用到哪些索引,实际上用到了什么索引?

MySQL 提供了一个执行计划的工具。我们在 SQL 语句前面加上 EXPLAIN,就可以看到执行计划的信息。

EXPLAIN select name from user where id=1;

存储引擎

在介绍存储引擎先来问两个问题:

1、从逻辑的角度来说,我们的数据是放在哪里的,或者说放在一个什么结构里面?

2、执行计划在哪里执行?是谁去执行?

存储引擎基本介绍

在关系型数据库里面,数据是放在表 Table 里面的。我们可以把这个表理解成 Excel 电子表格的形式。所以我们的表在存储数据的同时,还要组织数据的存储结构,这个存储结构就是由我们的存储引擎决定的,所以我们也可以把存储引擎叫做表类型。

在 MySQL 里面,支持多种存储引擎,他们是可以替换的,所以叫做插件式的存储引擎。为什么要支持这么多存储引擎呢?一种还不够用吗?

在 MySQL 里面,每一张表都可以指定它的存储引擎,而不是一个数据库只能使用一个存储引擎。存储引擎的使用是以表为单位的。而且,创建表之后还可以修改存储引擎。

如何选择存储引擎?

  • 如果对数据一致性要求比较高,需要事务支持,可以选择 InnoDB。

  • 如果数据查询多更新少,对查询性能要求比较高,可以选择 MyISAM。

  • 如果需要一个用于查询的临时表,可以选择 Memory。

  • 如果所有的存储引擎都不能满足你的需求,并且技术能力足够,可以根据官网内部手册用 C 语言开发一个存储引擎。(https://dev.mysql.com/doc/internals/en/custom-engine.html%EF%BC%89 )

执行引擎

谁使用执行计划去操作存储引擎呢?这就是执行引擎(执行器),它利用存储引擎提供的相应的 API 来完成操作。

为什么我们修改了表的存储引擎,操作方式不需要做任何改变?因为不同功能的存储引擎实现的 API 是相同的。

最后把数据返回给客户端,即使没有结果也要返回。

栗子

还是以上面的sql语句为例,再来梳理一下整个sql执行流程。

select name from user where id = 1 and age &gt;20;
  • 通过连接器查询当前执行者的角色是否有权限,进行查询。如果有的话,就继续往下走,如果没有的话,就会被拒绝掉,同时报出 Access denied for user 的错误信息;

  • 接下来就是去查询缓存,首先看缓存里面有没有,如果有呢,那就没有必要向下走,直接返回给客户端结果就可以了;如果缓存中没有的话,那就去执行语法解析器和预处理模块。( MySQL 8.0 版本直接将查询缓存的整块功能都给删掉了)

  • 语法解析器和预处理主要是分析sql语句的词法和语法是否正确,没啥问题就会进行下一步,来到查询优化器;

  • 查询优化器就会对sql语句进行一些优化,看哪种方式是最节省开销,就会执行哪种sql语句,上面的sql有两种优化方案:

    • 先查询表 user 中 id 为 1 的人的姓名,然后再从里面找年龄大于 20 岁的。
    • 先查询表 user 中年龄大于 20 岁的所有人,然后再从里面找 id 为 1 的。
  • 优化器决定选择哪个方案之后,执行引擎就去执行了。然后返回给客户端结果。

更多编程相关知识,请访问:编程视频!!

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer