MySQL执行SQL语句的流程详解

yizhihongxing

MySQL 执行 SQL 语句的流程详解

MySQL 是一种开源的,常见的关系型数据库管理系统。SQL (Structured Query Language)是一种用于管理关系型数据库的语言。在进行数据库操作时,我们需要编写 SQL 语句,MySQL 会根据 SQL 语句的执行计划实现数据的存储和管理。

MySQL 执行 SQL 语句的步骤

1. 连接数据库

当我们在终端使用命令行工具如 mysql 命令进入 MySQL 后,就会连接到 MySQL 数据库中,此时 MySQL 会从客户端接收到一条 SQL 语句。如果 MySQL 没有接收到任何 SQL 语句,那么它会一直保持监听状态,等待客户端发送数据。

2. 词法分析

MySQL 会将接收到的 SQL 语句进行语法分析,判断语句的语法是否正确,并将语句分解为多个 Token,即单词,每个单词表示为 Token 的一部分。

举个例子,当我们编写 SQL 代码如下时:

SELECT * FROM users WHERE age > 18;

MySQL 会将代码分解为以下单词(这些单词我们称之为 Token):

Token[0] = SELECT
Token[1] = *
Token[2] = FROM
Token[3] = users
Token[4] = WHERE
Token[5] = age
Token[6] = >
Token[7] = 18
Token[8] = ;

3. 语法分析

MySQL 将单词组合成完整的语句,生成 AST (Abstract Syntax Tree) 抽象语法树,执行时会根据这个抽象语法树实现 SQL 语句的执行。

举个例子,对于如下 SQL 语句:

SELECT * FROM users WHERE age > 18;

MySQL 会将其解析为:

stmt
 |-> Select_stmt
       |-> SELECT
       |-> SELECT_LIST -> *
       |-> FROM clause -> users
       |-> WHERE clause
              |-> age
              |-> >
              |-> value -> 18

4. 执行 SQL 语句

MySQL 在执行 SQL 语句前,会先进行一次性的优化并生成执行计划,执行计划指明了 SQL 执行的具体逻辑。

MySQL 执行 SQL 语句的步骤如下:

  1. 根据 MySQL 的执行计划逻辑,依次读取数据表的数据;
  2. 判断表中每条数据的字段信息是否满足 SQL 语句的查询条件;
  3. 将满足查询条件的数据进行筛选并且组合成符合查询条件的新数据集;
  4. 返回结果集给 MySQL 客户端。

5. 断开连接

MySQL 将结果返回给客户端完成后,就会与客户端断开连接。

SQL 执行实例

下面我们来了解一个简单的示例,该示例包含表 orders 和 users,其中 orders 表含有用户订单的数据,而 users 表包含用户的个人信息数据。现在我们需要查询购买商品ID为1的用户的信息和其订单的相关信息, SQL 语句如下:

SELECT users.username, users.email, orders.order_id, orders.order_date, orders.amount
FROM orders
LEFT JOIN users ON orders.user_id = users.user_id
WHERE orders.goods_id = 1;
  1. 连接数据库后,将 SQL 语句发送给 MySQL;
  2. MySQL 将 SQL 语句进行词法分析,生成如下的 Token 数组:
Token[0] = SELECT
Token[1] = users.username,
Token[2] = users.email,
Token[3] = orders.order_id,
Token[4] = orders.order_date,
Token[5] = orders.amount
Token[6] = FROM
Token[7] = orders
Token[8] = LEFT JOIN
Token[9] = users
Token[10] = ON orders.user_id = users.user_id
Token[11] = WHERE
Token[12] = orders.goods_id
Token[13] = =
Token[14] = 1
  1. MySQL 进行语法分析,并生成如下的抽象语法树:
stmt
 |-> Select_stmt
         |-> SELECT
         |-> SELECT_LIST
                     |-> users.username
                     |-> users.email
                     |-> orders.order_id
                     |-> orders.order_date
                     |-> orders.amount
         |-> FROM clause -> orders
         |-> LEFT JOIN
                     |-> users
                     |-> ON clause
                               |-> left -> orders
                                            |-> user_id
                               |-> right -> users
                                            |-> user_id
         |-> WHERE clause
                     |-> orders.goods_id
                     |-> =
                     |-> value -> 1
  1. MySQL 根据执行计划递归搜索数据表 orders 和 users,依次判断每一条数据是否符合查询条件,生成结果集输出:
username    email           order_id  order_date             amount
张三         zhangsan@qq.com        1  2022-01-01 00:00:00   199.99
李四         lisi@qq.com            3  2022-01-03 00:00:00   69.99

总结

MySQL 执行 SQL 语句可能涉及到许多隐藏的细节,但总体上可以分成连接数据库,词法分析,语法分析,执行 SQL 语句和断开连接等阶段。我们需要深入了解每个阶段的作用和执行过程,并且能够优化我们的 SQL 语句,从而使查询更加高效、准确。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL执行SQL语句的流程详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Mysql之INTERVAL与DATE_SUB与EXTRACT函数的使用

    1. INTERVAL INTERVAL代表的是时间间隔MySQL中的时间间隔类型有如下几种:       1.1 利用INTERVAL做时间的加减法 示例: 加法:SQL>SELECT DATE ‘2018-11-01′ + INTERVAL ’10 11’ DAY_HOUR;结果:2018-11-11 11:00:00减法:SQL> sele…

    MySQL 2023年4月13日
    00
  • Navicat Premium12远程连接MySQL数据库

     https://blog.csdn.net/dengjin20104042056/article/details/95091506 方法二: step1: 修改表user mysql> use mysql; mysql> update user set host = ‘%’ where user = ‘root’; mysql>flush…

    MySQL 2023年4月13日
    00
  • MySQL冷备份所需物理文件

    MySQL冷备份是一种备份方式,它的特点是备份过程中数据库不会被访问或修改。这种备份方式可以在数据库运行期间进行,不会对正常业务产生影响,并且备份文件的大小、恢复速度、稳定性都比较好。 在进行MySQL冷备份时,需要备份一些物理文件。 数据库文件 MySQL的数据库文件通常存储在数据目录下,这些文件包括数据文件(.frm、.ibd等)和日志文件(.ib_lo…

    MySQL 2023年3月10日
    00
  • mysql运维——分库分表

    1. 介绍 问题分析: 随着互联网以及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈: IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈。CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。分库分表的中心…

    MySQL 2023年4月13日
    00
  • MySQL分区表管理命令汇总

    MySQL分区表管理命令汇总 什么是MySQL分区表 MySQL分区表是MySQL数据库中一种特殊的表,它将数据分散到多个物理分区中,每个分区只包含表的一部分行,从而能够更高效地查询和管理大量数据。 创建MySQL分区表 创建MySQL分区表的关键是在创建表时使用PARTITION BY子句,其常见的分区方式有以下几种: RANGE分区:按照范围对数据进行分…

    MySQL 2023年5月19日
    00
  • mysql-作业

    一、表关系   请创建如下表,并创建相关约束                 班级表:class       学生表:student       cid caption grade_id   sid sname gender class_id 1 一年一班 1   1 乔丹 女 1 2 二年一班 2   2 艾弗森 女 1 3 三年二班 3   3 科比 男…

    MySQL 2023年4月13日
    00
  • MySQL深分页问题解决的实战记录

    MySQL深分页问题解决的实战记录 问题描述 MySQL在处理大量数据时,可能会遇到深分页问题。深分页指的是,当使用LIMIT进行分页时,如果要访问的数据量较大(如上百万条记录),这将会导致MySQL需要扫描大量的记录,从而导致查询速度变慢,更容易造成内存和CPU的浪费。在此情况下,需要解决MySQL的深分页问题。 问题解决方案 方案1:使用游标(curso…

    MySQL 2023年5月19日
    00
  • mysql关键字

    在今儿hibernate执行save方法的时候显示sql语法错误 Sql代码   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    数据…

    MySQL 2023年4月16日
    00
合作推广
合作推广
分享本页
返回顶部