【大白话系列】MySQL 学习总结 之 初步了解 MySQL 的架构设计

一、MySQL还是个黑盒子

我们都知道,只要我们系统引入了 MySQL 驱动和连接池,就能从数据库连接池获取一个数据库连接,然后就可以执行增删改查的操作了。
可是我们并不知道 MySQL 里面是怎么执行的,例如我们执行了 insert 语句,只知道表里面多了一条数据,MySQL 是怎么插入的我们就不知道了。

二、解开 MySQL 这个黑盒子

1、一条工作线程:

举例:
我们都知道,在 Socket 编程里,ServerSocket 会有一条线程负责监听 Socket 发送过来的网络请求,并且负责从网络请求里读取请求数据,然后再进行处理 。

原理:
那么在 MySQL 里也是一样的道理,会有一条工作线程专门去监听 MySQL 数据库连接池里的网络请求,并且负责将请求中的 SQL 读取出来。

2、 SQL 接口:

上面说到 MySQL 的工作线程会从网络连接中读取 SQL。但是接下来是由谁继续执行呢?
举例:
我们可以想象一下,在我们的 Web 系统里头,Tomcat 这个进程会接收客户端的网络请求,然后经过转发交给我们写的接口执行。

举例:
在 MySQL 里其实也一样,MySQL 就是一个数据库管理系统,上面提及到的工作线程会接收各个客户端的网络请求,然后经过转发交给内部的接口执行。
而这里的内部接口,叫 SQL 接口,它是 MySQL 内部里的一个组件。它是一套执行 SQL 语句的接口,专门执行我们的那些增删改查的 SQL 语句。

3、查询解析器:

举例:
我们都知道,现在的计算机其实都不懂得我们输入的命令,它只懂最后的 接收到的0/1信号。

举例:
MySQL 也一样,虽然我们按照一定的 SQL 语法写出了 SQL,但是 MySQL 却不能直接读懂这个 SQL 语句,并且因为 MySQL 的数据最后是存放在磁盘文件中的,所以需要先解析 SQL 语句,才知道怎么从磁盘文件中读取数据、修改数据、新增数据或者是删除数据。
这时候,查询解析器就来了,它会专门对 SQL 语句按照一定的规则进行解析,然后让 MySQL 理解这个 SQL 语句是要干啥的。

4、查询优化器:

举例:
相信大家都听过这么一句话:条条大道通罗马,但是肯定有的路近,有的路远。

举例:
而 MySQL 执行 SQL 一样,也有很多种执行方法可以得到一样的结果,但是必定有的方法执行效率高,有的方法执行效率低。
这个时候,查询优化器就来了,它会为 SQL 制定一套最优的执行计划。

5、执行器:

上面提到了最优的执行计划,那么计划必须有人的去执行,才能得到我们写的 SQL 的结果。

这时候,MySQL 里的执行器会按照查询优化器生成的一套最优执行计划,一步一步的执行下去,知道完成这个计划为止。

6、存储引擎:

其实到了最后,真正操作数据库数据的是 MySQL 里的存储引擎。上面的执行器会根据执行计划去不断调用存储引擎的接口来完成执行计划。

原文地址:https://www.cnblogs.com/Howinfun/p/12283457.html

时间: 2024-10-19 00:52:50

【大白话系列】MySQL 学习总结 之 初步了解 MySQL 的架构设计的相关文章

【大白话系列】MySQL 学习总结 之 初步了解 MySQL Server 的 binlog 组件

一.上节回顾 上节我们讲到,建议将 redo log 的刷盘策略设置为1:即提交事务时,强制将 redo log buffer 里的 redo log 刷入到磁盘后才算事务提交成功. 但是我们都知道,redo log buffer 是 InnoDB 存储引擎的组件,而 MySQL 支持很多种存储引擎,那么 MySQL 在撇除存储引擎后,自己就没有记录一下关于数据更新的日志吗? 二.binlog 日志文件 redo log 本身是 InnoDB 存储引擎特有的一个东西,所以 MySQL 也提供了一

mysql学习笔记(七)—— MySQL内连接和外连接

    MySQL内连接(inner join on) MySQL的内连接使用inner join on,它的效果跟使用where是一样的,如果联结的是两个表,那么需要左右的条件或者说字段是需要完全匹配的. 来看个例子:有两张表customers客户表和orders订单表,外键是cust_id,我们需要知道哪些客户有订单 select customers.cust_id,orders.order_num from customers , orders where customers.cust_i

MySQL学习2 使用docker建立mysql服务

在centos 7的服务器上运行 yum install docker 安装完docker后,运行 service docker start 启动docker 由于公司的服务器连接dockerhub一直有些问题,估计是gfw导致的,所以只能下载一个国内的镜像 https://hub.tenxcloud.com/ 大家可以到时速云搜索自己需要的image 我选择了star最高的一个mysql的镜像 使用以下命令将mysql的image下载到了本地 docker pull index.tenxclo

MySQL学习(一)——启动和登录MySql遇到的问题及解决

1.MySQL使用命令行启动时报错"发生系统错误 5",如下: 原因:未用管理员身份运行cmd程序 解决方案:在开始菜单里找到命令提示符,右击选择以管理员身份运行 2.登录时报错"提示mysql不是内部或外部命令,也不是可运行的程序或批处理文件" 解决方案:配置环境变量(右击我的电脑->高级系统设置->环境变量,选择Mysql安装的目录,在Mysql安装的目录中找到bin目录,把此路径复制.选择系统中的path->编辑->把刚复制的路径添加进

MySQL学习笔记之九:MySQL Replication

Mysql内建的复制功能是构建大型.高性能应用程序的基础.复制功能不仅有利于构建高性能的应用,同时也是高可用性.可扩展性.灾难恢复.备份以及数据仓库等工作的基础. 一.复制概述 1.复制的功用 数据分布.负载均衡.备份.高可用性.MySQL升级测试 2.复制的工作原理 ①主库把数据更改记录到二进制日志(binary log)中 ②备库将主库的二进制日志复制到本地的中继日志(relay log)中.首先,备库会启动一个I/O线程,跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储

Citrix Profile Management 和 VDI系列讲座之三:大规模环境下的扩展架构设计

说好了要写三期的,上周在出差,最后一期姗姗来迟,还望大家见谅,特别是那些给我回信问我问题的XD们. 咱们第一期讲了如何配置CitrixProfile Management 和 Folder Redirection,第二期讲了性能参数调优,这第三期就升华一下,探讨一下如何在大规模环境中做到文件服务器或者是NAS设备的扩展,同时如何管理用户使用这些设备? 相信你也知道,如果你的环境里面只有500个并发的XenApp用户,或者是500个VDI桌面,那我想这个环境的搭建不会太复杂,一台文件服务器或者是一

mysql学习笔记(二)--- MySQL数据类型

[正文] 上一章节中,我们学习了MySQL软件的安装,既然软件都装好了,现在就正式开始MySQL的基础知识的学习吧,即使是零基础,也要一步一个脚印.恩,首先要学习的就是MySQL的数据类型. 一.数据类型: 1.整型(xxxint) 2.浮点型(float和double) 3.定点数(decimal) 4.字符串(char,varchar,xxxtext) 5.二进制数据(xxxBlob) 6.日期时间类型 二.数据类型介绍: 1.整型: 注:M表示最大的显示宽度.其中,int用的最多. 2.浮

MySQL学习笔记(六)—— MySQL自连接

有的时候我们需要对同一表中的数据进行多次检索,这个时候我们可以使用之前学习过的子查询,先查询出需要的数据,再进行一次检索. 例如:一张products表,有产品id,供应商id(vend_id),产品名称等等. mysql> select * from products; +---------+---------+-----------+------------+-----------+ | prod_id | vend_id | prod_name | prod_price | prod_de

MySQL学习9:详解MySQL中的外键约束

本篇主要讲解MySQL中的外键约束. 一约束概述 创建约束的目的就是保证数据的完整性和一致性.约束根据约束针对的字段的数目的多少划分为表级约束和列级 约束. 如果约束按照功能来划分的话刻印划分为:NOT NULL(非空约束).PRIMARY KEY(主键约束).UNIQUE KEY(唯一约束).DEFAULT(默认约束)和FOREIGN KEY(外键约束). 在前面我们已经初步涉及到了除外键约束之外的四个约束,这一次我们来谈谈最复杂的外键约束. 二外键约束的要求 FOREIGN KEY(外键约束