MySQL组成

本文涉及的产品
RDS Agent(兼容OpenClaw),2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: MySQL组成

1、系统如何和MySQL打交道

在Java工程师的眼中,MySQL就是一个用来存放数据并对数据进行增删改查的一个应用,平时我们在做Java系统的时候,一般情况下都会连接到一个MySQL上面去,执行各种增删改查操作;但是在使用中总是会遇到一些问题的,比如死锁异常、SQL性能太差、异常报错等,有时候虽然通过查询资料等解决了这些问题,当时对于为什么出现这些问题、里面的原理是什么样的,还是一无所知。

2、MySQL的底层驱动到底是什么东西

我们知道,我们Java系统如果要去访问一个数据库,必须要在系统的依赖里面加入一个MySQL驱动,有了这个启动我们才能和数据库建立连接,然后执行各种sql语句。 那么这个MySQL驱动到底是什么东西?

我们知道系统直接的连接肯定是通过网络来进行的,对吧,所以我们Java系统和数据库的网络连接由谁来建立呢,没错就是这个MySQL驱动,它会在底层跟数据库建立一个网络连接,有了网络连接,我们才可以把sql语句发送到MySQL服务器上面去执行。

3、数据库连接池到底是用来干嘛的

一个Java系统肯定不会和数据库只建立一个连接,假设我们用Java开发了一个web系统,这个系统被部署到了tomcat。那么tomcat本身肯定是会有多个线程来并发的处理同时接收到的用户的多个请求的。这个时候,如果tomcat中的多个并发的线程都需要去操作数据库,那他们肯定会去争夺一个连接,这样效率肯定会很低。

既然这样那么数据库肯定不能只有一个连接,那如果tomcat中的每个线程在需要访问数据的时候,都基于MySQL驱动去创建一个新的数据库连接,然后执行sql语句,执行完毕之后在销毁这个线程,这样可以吗?

很显然这样也是不行的,我们知道创建一个网络连接是很耗费资源和时间的,这样频繁的去创建、销毁线程会导致占用大量的资源和时间,导致效率低下。

所以既然我们要执行sql语句必须要MySQL连接,而且其创建和销毁还很麻烦,那我们就想能不能复用呢,你用完了我接着用,不就行了嘛。

我们在Java系统中以及知道了有很多的数据连接池,比如DBCP、C3P0、Druid等等,它们起到的作用就是来复用数据库连接,我们创建一个数据库连接,在用完之后,不要将其销毁,而是将其放入连接池里面,下次其他线程要是有的时候,直接在连接池里面取出来使用就行了。

既然我们Java系统的连接池可以同时保持多个数据库连接,那么MySQL会不会也有自己的连接池呢?这是肯定的,MySQL内部也有自己的连接池,MySQL中的连接池就是为了维护和系统之间多个数据库连接而存在的,这样你就可以并发的去访问数据库了。

image.png

4、网络连接由谁处理 --->线程

我们知道,网络连接必须得分配给一个线程去处理,由一个线程来监听请求以及读取请求数据,比如从网络中读取和解析出来一条我们发送过去的sql语句,所以我们知道了,MySQL内部肯定有一个线程,去负责连接的监听和建立。

5、谁负责处理接受到的SQL语句 ---> SQL接口

当MySQL内部的工作线程从一个网络连接中读取出来以恶SQL语句之后,此时会如何来执行这个SQL语句呢? 为了解决这个问题,MySQL内部提供了一个组件,就是SQL接口(SQL interface),他是一套执行SQL语句的接口,专门用来执行我们发送给MySQL的那些增删改查的SQL语句。 因此MySQL的工作线程在接收到SQL语句之后,就会将其交给SQL接口去执行。

6、让MySQL能看懂SQL语句 ---> 查询解析器

上面说所有的SQL语句都会交给SQL接口,但是SQL接口怎么看懂这个SQL语句呢,这就需要 ** 查询解析器 ** 。这个查询解析器(Parser)就是负责对SQL语句进行解析的,比如对下面的这个SQL语句进行一下解析。 select id,name,age from users where id =1; (1).我们要从"users"表里面查询字段。 (2).查询"id"字段的值等于1的那行数据。 (3).对查询出来的那行数据里面要提取"id,name,age"这三个字段。

所以SQL解析,就是按照既定的SQL语法,对我们按照SQL语法规则编写的SQL语句进行解析,然后理解这个SQL语句要干嘛。

7、 选择最优的查询路径 ---> 查询优化器

当我们通过解析器理解了SQL语句要干啥之后,接着就会找查询优化器(Optimizer)来选择一个最优的查询路径。 那到底什么才是最优查询路径,我们看下面这个例子 select id,name,age from users where id =1; (1).我们要从"users"表里面查询字段。 (2).查询"id"字段的值等于1的那行数据。 (3).对查询出来的那行数据里面要提取"id,name,age"这三个字段。 通过上面的SQL解析器我们知道了这个SQL语句要干这么一件事,但是这件事要怎么干,会有不同的方式也就是路径。比如我们有下面这样的两种路径, 第一种: (1)、直接定位到"users"表中的"id"字段等于1的哪一行。 (2)、在这一行中查询处理需要的"id,name,age"三个字段。 第二种: (1)、先从users表中查询出所有行的"id,name,age"这三个字段。 (2)、然后在里面过滤出id=1的那一行。

到底按照哪一种路径去执行,就是查询优化器帮我们去选择。

8、真正执行SQL语句 ---> 存储引擎

最后一步就是把查询优化器选择的最优查询路径,交给底层的存储引擎去真正的执行。 但是我们现在以及有了一个SQL如何去执行的步骤了,但是我们怎么知道那些数据在内存里、那些数据在磁盘里?我们执行SQL语句是更新内存数据,还是更新磁盘数据等等。这些问题我们一无所知。这个时候就需要存储引擎了,存储引擎会根据一定的步骤去查询内存中的缓存数据、更新磁盘数据、查询磁盘数据等等。 在MySQL的架构设计中,SQL接口、SQL解析器、查询优化器都是通用的;但是存储引擎的话,它是支持各种各样的存储引擎的,比如InnoDB、MyISAM、Memory等等。

9、根据执行计划调用存储引擎接口 ---> 执行器

那么看完存储引擎之后,我们还是会有一个疑问,存储引擎帮我们去访问磁盘上的数据,那么是谁来调用存储引擎的接口呢? 所有这中间会存在一个执行器的东西,这个执行器会根据我们优化器选择的方案,去调用存储引擎的接口按照一定的顺序和步骤,就把SQL语句的逻辑给执行了。 举个例子,比如执行器可能会先调用存储引擎的一个接口,去获取“users”表中的第一行数据,然后判断一下这个数据的“id”字段的值是否等于我们期望的一个值,如果不是的话,那就继续调用存储引擎的接口,去获取“users”表的下一行数据。 所以基于上面的思路,执行器就会去根据我们的优化器生成的一套执行计划。然后不停的调用存储引擎的各种接口去完成SQL语句的执行计划。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
缓存 前端开发 JavaScript
Vite 构建流程大揭秘:快速构建前端项目的秘密武器
Vite 构建流程大揭秘:快速构建前端项目的秘密武器
|
编解码
一文详解 URLEncode
使用浏览器进行Http网络请求时,若请求query中包含中文,中文会被编码为 `%+16进制+16进制`形式,但你真的深入了解过,为什么要进行这种转义编码吗?编码的原理又是什么?
1977 0
一文详解 URLEncode
|
7月前
|
监控 关系型数据库 MySQL
《理解MySQL数据库》连接管理与连接池深度解析
本文深入解析MySQL连接管理与Java连接池技术,涵盖数据库连接原理、服务端线程模型、主流连接池(HikariCP、Druid)对比及核心参数配置。重点介绍生产环境最佳实践,包括连接池选型、性能调优、监控告警与故障排查,助力构建高性能、高可用的数据库访问架构。
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第7天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建 Spring Boot 项目并配置 Spring Security。接着,实现后端 API 以提供菜单数据。在前端部分,使用 Ant Design Pro Vue 脚手架创建项目,并配置动态路由和菜单。最后,启动前后端服务,实现高效、美观且功能强大的应用框架。
484 2
|
开发框架 JavaScript 前端开发
SpringBoot + Ant Design Pro Vue实现动态路由和菜单的前后端分离框架
Ant Design Pro Vue默认路由和菜单配置是采用中心化的方式,在 router.config.js统一配置和管理,同时也提供了动态获取路由和菜单的解决方案,并将在2.0.3版本中提供,因到目前为止,官方发布的版本为2.0.2,所以本文结合官方提供的解决方案结合SpringBoot后台权限管理进行修改,搭建一套完整的SpringBoot +Vue前后端分离框架。
1380 0
|
前端开发 JavaScript 开发者
前端技术栈:探索现代Web开发的核心要素与代码实践
前端技术栈:探索现代Web开发的核心要素与代码实践
580 1
|
JavaScript Java 测试技术
基于SpringBoot+Vue的原神游戏商城的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的原神游戏商城的详细设计和实现(源码+lw+部署文档+讲解等)
281 0
|
SQL 存储 Java
Java中ORM框架的选择及其应用指南
Java中ORM框架的选择及其应用指南