MySQL篇|02一条SQL执行的历程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 当打开某一个数据库客户端,连接数据库,输入一条SQL语句,点击执行后输出其结果。执行的过程中,发生了什么?

当打开某一个数据库客户端,连接数据库,输入一条SQL语句,点击执行后输出其结果。执行的过程中,发生了什么?

客户端与 MySQL 的交互过程的原理图,如下图所示。

CgotOV14ySKAMxohAAH2VHcAzkE612.png

查询语句的轨迹

一条查询语句的轨迹是怎么样的?

select id from bas_student;
  • 客户端通过MySQL的Client Connection建立连接
  • 查询缓存。前提是开启查询缓存功能。开启了,在查询缓存过程中查询到完全相同的SQL语句时将查询结果直接返回给客户端,未开启或未查到数据则进入下一步
  • 前提是未开启查询缓存或开启了却没查到数据,进入解析器进行语法语义解析,生成解析树
  • 预处理器生成新的解析树
  • 查询优化器生成执行计划,其实就是选择最优的查询路径
  • 查询执行引擎执行SQL语句,通过执行器组件去执行,其根据执行计划,调用存储引擎的各种接口去执行SQL语句,查询到数据后不仅把结果返回给客户端,也将结果保存到查询缓存中

更新语句的轨迹

一条更新语句的轨迹时怎么样?

update bas_student set name = 'jasen' where id= 2021;

和查询语句的执行轨迹基本一致,但更新语句会涉及两个重要的日志模:redo log 重做日志 和 bin log 归档日志。

  • redo log prepare

    • 存储引擎将新记录更新到内存中,并将这个操作记录到redo log中,此时redo log 处于prepare状态,随时可以提交事务。
  • bin log

    • 执行器生成操作的bin log 并将bin log写入磁盘
  • redo log commit

    • 执行期调用引擎提交事务的接口,将redo log 状态改为commit

扩展

查询缓存功能很薄弱,MySQL8.0已废弃查询缓存功能

如果开启查询缓存,SQL语句必须完全都一摸一样,才能查到该结果,对于更新语句一摸一样的数据会比较少,且对于表中的数据如果更新了,该表的缓存也会失效。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
SQL 关系型数据库 MySQL
SQL语句编写的练习(MySQL)
这篇文章提供了MySQL数据库中关于学生表、课程表、成绩表和教师表的建表语句、数据插入示例以及一系列SQL查询练习,包括查询、排序、聚合和连接查询等操作。
|
12天前
|
SQL 关系型数据库 MySQL
INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
【8月更文挑战第7天】INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
16 5
|
10天前
|
SQL 关系型数据库 MySQL
MySQL中一定要遵守的12个SQL规范
本文档提供了12条SQL编写和数据库管理的最佳实践建议,旨在帮助开发者提高SQL查询效率、增强数据库安全性及可维护性。
|
12天前
|
SQL 关系型数据库 MySQL
“震撼揭秘!Flink CDC如何轻松实现SQL Server到MySQL的实时数据同步?一招在手,数据无忧!”
【8月更文挑战第7天】随着大数据技术的发展,实时数据同步变得至关重要。Apache Flink作为高性能流处理框架,在实时数据处理领域扮演着核心角色。Flink CDC(Change Data Capture)组件的加入,使得数据同步更为高效。本文介绍如何使用Flink CDC实现从SQL Server到MySQL的实时数据同步,并提供示例代码。首先确保SQL Server启用了CDC功能,接着在Flink环境中引入相关连接器。通过定义源表与目标表,并执行简单的`INSERT INTO SELECT`语句,即可完成数据同步。
38 1
|
7天前
|
SQL 关系型数据库 MySQL
Go语言中进行MySQL预处理和SQL注入防护
在现代Web应用开发中,安全性至关重要。SQL注入是一种常见的攻击方式,攻击者可通过构造特殊SQL查询来非法访问或修改数据库数据。本文介绍如何利用Go语言中的预处理SQL语句来防范此类攻击。预处理不仅能提升安全性,还能提高性能并简化代码。通过使用`?`作为占位符,Go自动处理参数转义,有效避免SQL注入。此外,文章还提供了连接MySQL数据库、执行预处理查询以及最佳实践的示例代码。务必遵循这些指导原则,确保应用程序的安全性。
16 0
|
8天前
|
SQL 存储 Oracle
MySQL 项目中 SQL 脚本更新、升级方式,防止多次重复执行
MySQL 项目中 SQL 脚本更新、升级方式,防止多次重复执行
18 0
|
12天前
|
SQL 缓存 关系型数据库
[mysql]状态检查常用SQL
[mysql]状态检查常用SQL
|
6天前
|
存储 关系型数据库 MySQL
MySQL——数据库备份上传到阿里云OSS存储
MySQL——数据库备份上传到阿里云OSS存储
20 0
|
5天前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
8天前
|
Oracle 关系型数据库 MySQL
Mysql和Oracle数据库死锁查看以及解决
【8月更文挑战第11天】本文介绍了解决MySQL与Oracle数据库死锁的方法。MySQL可通过`SHOW ENGINE INNODB STATUS`查看死锁详情,并自动回滚一个事务解除死锁;也可手动KILL事务。Oracle则通过查询V$LOCK与V$SESSION视图定位死锁,并用`ALTER SYSTEM KILL SESSION`命令终止相关会话。预防措施包括遵循ACID原则、优化索引及拆分大型事务。