深入浅出MySQL:概述与体系结构解析
目录
-
- 1. 初识MySQL
-
- 1.1. 数据库
-
- 1.1.1. OLTP(联机事务处理)
- 1.1.2. OLAP(联机分析处理)
- 2. SQL
-
- 2.1. 定义
- 2.2. DQL(数据查询语言)
- 2.3. DML(数据操纵语言)
- 2.4. DDL(数据定义语言)
- 2.5. DCL(数据控制语言)
- 2.6. TCL(事务控制语言)
- 3. 数据库术语
- 4. MySQL体系结构
-
- 4.1. 连接器
- 4.2. MySQL内部连接池
-
- 4.2.1 线程模型
- 4.2.2. 主线程
- 4.2.3. 连接线程
- 4.2.4. MySQL的线程模型优化
- 4.3. 管理服务和工具组件
- 4.4. SQL接口
- 4.5. 查询解析器
- 4.6. 查询优化器
- 4.7. 缓冲组件
- 5. 数据库设计三范式及反范式
-
- 5.1. 空间和时间的关系
-
- 5.1.1. 三范式目的
- 5.1.2. 三范式内容
- 5.1.3. 反范式
- 5.2. 三范式与反范式的权衡
- 6. 怎么执行一条SELECT语句
-
- 6.1. 连接器
-
- 6.1.1. 接收连接
- 6.1.2. 管理连接
- 6.1.3. 校验用户信息
- 6.2. 查询缓存
-
- 6.2.1. 功能
- 6.2.2. 工作原理
- 6.3. 分析器
-
- 6.3.1. 词法分析
- 6.3.2. 语法分析
- 6.4. 优化器
-
- 6.4.1. 制定执行计划
- 6.4.2. 选择最优索引
- 6.4.3. 最小化执行成本
- 6.5. 执行器
-
- 6.5.1. 获取数据
- 6.5.2. 返回结果
- 参考
1. 初识MySQL
1.1. 数据库
数据库是按照一定的数据模型组织、存储和管理数据的集合。数据库系统可以分为不同类型,主要包括OLTP和OLAP。
1.1.1. OLTP(联机事务处理)
OLTP(Online Transaction Processing)主要用于处理大量的短事务,如插入、更新和删除操作。其特点包括:
- 高并发:支持大量用户同时操作。
- 事务性:确保数据的一致性和完整性。
- 实时性:快速响应用户请求。
- 应用场景:电商平台、银行系统、在线订票等。
1.1.2. OLAP(联机分析处理)
OLAP(Online Analytical Processing)主要用于复杂的查询和数据分析。其特点包括:
- 复杂查询:支持多维度、多层次的数据分析。
- 大数据量:处理和分析海量数据。
- 数据仓库:通常建立在数据仓库基础上。
- 应用场景:商业智能、市场分析、数据挖掘等。
2. SQL
SQL(Structured Query Language)是用于管理和操作关系数据库的标准语言。SQL包括多个子语言,每个子语言负责不同的功能。
2.1. 定义
SQL是一种用于与数据库进行通信的语言,支持数据的查询、更新、插入和删除等操作。它同时支持数据库对象的创建和管理,如表、视图和索引。
2.2. DQL(数据查询语言)
DQL主要用于查询数据,最常用的命令是SELECT。
示例:
SELECT name, age FROM users WHERE age > 18;
2.3. DML(数据操纵语言)
DML用于数据的插入、更新和删除操作,包括INSERT、UPDATE和DELETE。
示例:
INSERT INTO users (name, age) VALUES ('Alice', 30);
UPDATE users SET age = 31 WHERE name = 'Alice';
DELETE FROM users WHERE name = 'Alice';
2.4. DDL(数据定义语言)
DDL用于定义和管理数据库结构,包括CREATE、ALTER和DROP等命令。
示例:
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),age INT
);
ALTER TABLE users ADD COLUMN email VARCHAR(100);
DROP TABLE users;
2.5. DCL(数据控制语言)
DCL用于权限管理,包括GRANT和REVOKE。
示例:
GRANT SELECT, INSERT ON database_name.* TO 'user'@'localhost';
REVOKE INSERT ON database_name.* FROM 'user'@'localhost';
2.6. TCL(事务控制语言)
TCL用于管理数据库事务,包括BEGIN、COMMIT和ROLLBACK。
示例:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT;
3. 数据库术语
- 表(Table):数据库中的基本存储单元,由行和列组成。
- 行(Row):表中的一条记录,代表一个实体。
- 列(Column):表中的一个字段,代表实体的属性。
- 主键(Primary Key):唯一标识表中每一行的字段。
- 外键(Foreign Key):用于关联两个表的字段,保证数据的参照完整性。
- 索引(Index):用于加速数据查询的结构。
- 视图(View):基于一个或多个表的虚拟表。
- 事务(Transaction):一组操作的集合,要么全部执行,要么全部不执行。
4. MySQL体系结构

MySQL的体系结构包括多个组件,每个组件负责不同的功能。
4.1. 连接器
连接器负责管理客户端与MySQL服务器之间的连接。
- 接收连接:处理客户端的连接请求。
- 管理连接:维护和管理现有的连接,包括连接的生命周期。
- 校验用户信息:验证用户的身份和权限,确保安全性。
4.2. MySQL内部连接池
内部连接池用于优化连接管理,减少连接的建立和关闭带来的开销。通过复用现有的连接,提高系统性能和资源利用率。
4.2.1 线程模型

在MySQL的架构中,多线程模型用于处理客户端的连接请求和SQL命令。以下是更具体的解释:
4.2.2. 主线程
- 职责:主线程是MySQL服务器的核心,负责监听并接受来自客户端的连接请求。
- 工作流程:
- 使用
select()函数检测是否有新的连接请求。 - 当有新连接到来时,通过
accept()函数接收连接。 - 每个新连接通过调用
mysql_thread_create()函数创建一个新的工作线程,专门处理该客户端的请求。 - 处理线程负责该连接的整个生命周期,包括通信和命令执行。
- 使用
4.2.3. 连接线程
- 职责:连接线程是MySQL中每个客户端连接对应的独立线程,负责与客户端的通信和命令执行。
- 工作流程:
- 每个连接线程进入一个循环,等待客户端发送的数据并进行处理。
- 循环中的
read()函数读取客户端发送的SQL命令或其他请求。 do_command()函数执行相应的SQL命令或其他逻辑。
- 优势:
- 这种线程模型允许MySQL同时处理多个客户端请求,提高了并发能力和吞吐量。
4.2.4. MySQL的线程模型优化
- 多线程设计:适合需要同时处理大量并发连接的场景,提升系统的扩展性和响应速度。
- 优化手段:
- 线程池:通过预先创建一定数量的线程,复用线程资源,减少线程创建和销毁的开销。
- 连接池:管理和复用连接资源,提高资源利用率和系统性能。
4.3. 管理服务和工具组件
包括各种管理工具和服务,如:
- MySQL Shell:命令行工具,用于管理和开发。
- MySQL Workbench:图形化工具,用于数据库设计、管理和监控。
- 备份与恢复工具:如
mysqldump、mysqlpump等。
4.4. SQL接口
SQL接口是MySQL与用户交互的桥梁,负责接收和处理用户的SQL语句。它包括:
- 客户端接口:通过TCP/IP、Unix套接字等协议与客户端通信。
- 协议解析:解析客户端发送的SQL命令和请求。
4.5. 查询解析器
查询解析器负责将SQL语句解析成内部的执行计划。包括以下步骤:
- 词法分析:将SQL语句拆分成标记(tokens)。
- 语法分析:检查SQL语句的语法结构,生成语法树。
- 语义分析:检查SQL语句的语义正确性,如表和列的存在性。
4.6. 查询优化器
查询优化器负责制定高效的执行计划,以最小的资源消耗完成查询。其主要功能包括:
- 选择最优索引:根据查询条件选择合适的索引,提高查询速度。
- 优化查询顺序:调整表的连接顺序,减少中间结果集的大小。
- 成本估算:评估不同执行计划的成本,选择最低成本的计划。
4.7. 缓冲组件
缓冲组件用于缓存数据和索引,减少磁盘IO,提高查询性能。主要包括:
- 缓冲池(Buffer Pool):缓存数据页,加快数据读取速度。
- 查询缓存(已在8.0版本中移除):缓存查询结果,提高重复查询的响应速度。
5. 数据库设计三范式及反范式
数据库设计中的三范式(1NF、2NF、3NF)用于规范数据库结构,减少数据冗余,提高数据一致性。同时,反范式设计在特定情况下通过适度引入冗余来优化查询性能和满足特定需求。
5.1. 空间和时间的关系
在数据库设计中,空间和时间常常是相互制约的两个方面。三范式主要关注减少数据冗余(空间优化),而反范式则有时通过引入冗余来提高查询效率(时间优化)。
5.1.1. 三范式目的
- 减少空间占用:通过规范化设计,消除数据冗余,减少存储空间的浪费。
- 提高数据一致性:避免由于冗余数据带来的数据不一致问题。
- 简化维护:减少数据更新时的复杂性,降低维护成本。
5.1.2. 三范式内容
-
第一范式(1NF)
确保每个表的每一列都是原子的,不可再分割。即表中的每一列只包含单一值。
示例:
-
不符合1NF:
ID
Name
Hobbies
1
Alice
Reading, Swimming
-
符合1NF:
ID
Name
Hobby
1
Alice
Reading
1
Alice
Swimming
-
-
第二范式(2NF)
在满足1NF的基础上,消除非主属性对主键的部分依赖。即每个非主属性必须完全依赖于主键。
示例:
-
不符合2NF:
OrderID
ProductID
ProductName
Quantity
1
101
Widget
5
ProductName仅依赖于ProductID,而非OrderID和ProductID的组合主键。 -
符合2NF:
-
订单表:
OrderID
ProductID
Quantity
1
101
5
-
产品表:
ProductID
ProductName
101
Widget
-
-
-
第三范式(3NF)
在满足2NF的基础上,消除非主属性之间的传递依赖。即每个非主属性只依赖于主键,而不依赖于其他非主属性。
示例:
-
不符合3NF:
EmployeeID
EmployeeName
DepartmentID
DepartmentName
1
Bob
D001
Sales
DepartmentName依赖于DepartmentID,而DepartmentID依赖于EmployeeID。 -
符合3NF:
-
员工表:
EmployeeID
EmployeeName
DepartmentID
1
Bob
D001
-
部门表:
DepartmentID
DepartmentName
D001
Sales
-
-
5.1.3. 反范式
反范式指在数据库设计中适度引入冗余,以提高查询效率或满足特定需求。尽管违反了范式,但在实际应用中有时为了性能或简化查询而采用反范式设计。
示例:
- 在订单表中直接存储产品名称,而不是通过关联查询获取产品信息,以减少查询次数。
5.2. 三范式与反范式的权衡
在数据库设计过程中,设计师需要在三范式和反范式之间进行权衡,根据具体的应用场景和性能需求选择最合适的设计方案。
-
采用三范式的优点:
- 数据结构清晰,易于维护和扩展。
- 减少数据冗余,提高数据一致性。
- 简化数据更新操作,降低数据异常风险。
-
采用反范式的优点:
- 提高查询性能,减少复杂的联接操作。
- 适应特定业务需求,优化常用查询路径。
- 降低查询的复杂性,简化应用层逻辑。
-
权衡考虑:
- 性能需求:高并发和复杂查询场景可能更倾向于反范式设计。
- 维护成本:频繁变更的数据结构适合三范式设计。
- 数据一致性:需要严格数据一致性的应用应优先考虑三范式。
通过合理的设计,可以在三范式和反范式之间找到平衡点,既保证数据的规范性和一致性,又满足性能和业务需求。
6. 怎么执行一条SELECT语句

执行一条SELECT语句涉及多个步骤和组件,下面详细介绍其执行过程。
6.1. 连接器
6.1.1. 接收连接
MySQL服务器通过连接器接收来自客户端的连接请求。这些连接请求可以通过不同的协议(如TCP/IP、Unix套接字)进行。
6.1.2. 管理连接
连接器负责管理现有的连接,包括维护连接的生命周期、资源分配等。有效的连接管理能够提高系统的吞吐量和响应速度。
6.1.3. 校验用户信息
在建立连接时,连接器会验证用户的身份信息,包括用户名、密码和访问权限,确保只有授权用户才能访问数据库。
6.2. 查询缓存
注意:从MySQL 8.0版本开始,查询缓存已被移除。
6.2.1. 功能
查询缓存用于缓存SELECT语句的结果,当相同的查询再次执行时,直接返回缓存结果,避免重复计算。
6.2.2. 工作原理
- 缓存存储:查询结果以键值对的形式存储在缓存中。
- 命中缓存:如果查询在缓存中存在,直接返回结果。
- 未命中缓存:继续执行查询流程,生成新的查询结果并存入缓存。
6.3. 分析器
分析器负责将SQL语句解析为内部可执行的形式,主要包括:
6.3.1. 词法分析
将SQL语句拆分成基本的标记(tokens),如关键字、标识符、操作符等。
6.3.2. 语法分析
检查SQL语句的语法结构是否正确,并生成语法树(Parse Tree),用于后续的语义分析和优化。
6.4. 优化器
优化器负责生成高效的执行计划,优化查询性能。主要步骤包括:
6.4.1. 制定执行计划
根据语法树和数据库统计信息,生成多个可能的执行计划。
6.4.2. 选择最优索引
分析查询条件,选择最适合的索引,以减少扫描的数据量。
6.4.3. 最小化执行成本
评估各个执行计划的成本(如I/O操作、CPU使用),选择成本最低的执行计划。
6.5. 执行器
执行器根据优化器生成的执行计划,实际执行查询操作,主要包括:
6.5.1. 获取数据
从存储引擎中检索所需的数据,可能涉及读取磁盘或从缓冲池中获取数据页。
6.5.2. 返回结果
将查询结果组织成客户端可理解的格式,并通过连接器返回给客户端。
通过上述步骤,MySQL能够高效地处理和执行SELECT语句,确保数据的快速检索和一致性。了解MySQL的体系结构和执行流程,有助于优化数据库设计和提升系统性能。
参考
0voice · GitHub
相关文章:
深入浅出MySQL:概述与体系结构解析
目录 1. 初识MySQL 1.1. 数据库 1.1.1. OLTP(联机事务处理)1.1.2. OLAP(联机分析处理) 2. SQL 2.1. 定义2.2. DQL(数据查询语言)2.3. DML(数据操纵语言)2.4. DDL(数据定…...
tin这个单词怎么记
英语单词 tin,一般用作名词,意为“罐头;锡”: tin n.锡;罐头;罐;罐头盒;(盛涂料、胶水等的)马口铁罐,白铁桶;罐装物;金属食品盒;烘焙…...
【0005】Python变量详解
如果你觉得我的文章写的不错,请关注我哟,请点赞、评论,收藏此文章,谢谢! 本文内容体系结构如下: 任何一个语言编写的程序或者项目,都需要数据的支持,没有数据的项目不能称之为一个…...
yolov8_pose模型,使用rknn在安卓RK3568上使用
最近在使用rknn的一些功能,看了看文档以及自己做的一些jni,使用上yolov8_pose的模型. 1.我们先下载一下rknn的模型功能代码,rk有自己做的一套demo 地址:GitHub - airockchip/rknn_model_zooContribute to airockchip/rknn_model_zoo development by creating an account on G…...
HTTP 协议的发展历程:从 HTTP/1.0 到 HTTP/2.0
HTTP 协议的发展历程:从 HTTP/1.0 到 HTTP/2.0 HTTP(HyperText Transfer Protocol,超文本传输协议)是 Web 的基础协议,用于客户端和服务器之间的通信。从 HTTP/1.0 到 HTTP/2.0,HTTP 协议经历了多次重大改…...
PartitionFinder2 安装与使用-bioinfomatics tools 051
1. 引言 PartitionFinder2 是目前针对大中型数据集(核苷酸、氨基酸、形态数据)最理想的分区检测和进化模型选择工具。其推演的最优进化模型结果与 jModelTest2(核苷酸)和 ProTest3(氨基酸)的结果较为接近。…...
MCP与RAG:增强大型语言模型的两种路径
引言 近年来,大型语言模型(LLM)在自然语言处理任务中展现了令人印象深刻的能力。然而,这些模型的局限性,如知识过时、生成幻觉(hallucination)等问题,促使研究人员开发了多种增强技…...
ARM 架构下 cache 一致性问题整理
本篇文章主要整理 ARM 架构下,和 Cache 一致性相关的一些知识。 本文假设读者具备一定的计算机体系结构和 Cache 相关基础知识,适合有相关背景的读者阅读 1、引言 简单介绍一下 Cache 和内存之间的关系 在使能 Cache 的情况下,CPU 每次获取数…...
GB28181未来发展趋势,如何借助于EasyGBS国标GB28181平台+EasyGBD国标GB28181设备端抓住大机会
GB28181规范目前已经迎来了2022版,随着规范行业影响力和应用范围越来越大,相信还会有类似2028、2030等迭代版本出来,我们预测的GB28181发展趋势可能会是以下几个方面,感兴趣的也可以跟我单独探讨: 技术标准持续优化&a…...
代数结构—笔记
线性空间 如果满足以下性质,则域 K K K上定义了二元运算(加法)与二元函数(数乘)的非空集合 X X X称为线性空间。 1、加法封闭性:对任意 u , v ∈ X u, v \in X u,v∈X,存在 u v ∈ X uv\in X …...
tcc编译器教程1 配置tcc编译器环境
TinyCC(又名TCC)是一款开源小型但超快速的C编译器。下面介绍在windows下使用 1软件下载 tcc编译器官网为 https://www.bellard.org/tcc/ 下载地址为 http://download.savannah.gnu.org/releases/tinycc/ 选择其中tcc-0.9.27-win64-bin.zip进行下载 htt…...
安全模块设计:token服务、校验注解(开启token校验、开启签名校验、允许处理API日志)、获取当前用户信息的辅助类
文章目录 引言pom.xmlI 校验注解ApiValidationII token服务TokenService获取当前用户信息的辅助类III 域登录接口响应数据登陆用户信息引言 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/PO…...
机器学习:线性回归,梯度下降,多元线性回归
线性回归模型 (Linear Regression Model) 梯度下降算法 (Gradient Descent Algorithm) 的数学公式 多元线性回归(Multiple Linear Regression)...
报错The default superclass, “jakarta.servlet.http.HttpServlet“(已经配置好tomcat)
报错报错DescriptionResourcePathLocationType The default superclass,“jakarta.servlet.http.HttpServlet”, according to the project’s Dynamic Web Module facet version (5.0), was not found on the Java Build Path. 解决办法: 根据错误信息࿰…...
【人工智能】数据挖掘与应用题库(1-100)
1、涉及变化快慢的问题可以考虑使用导数来分析。 答案:对 2、导数的几何意义是曲线在某点处切线的斜率。 答案:对 3、函数在某点的左导数存在,则导数就存在。 答案:错 4、关于梯度下降算法,下列说法错误的是( ) 错误:梯度下降算法能找到函数精确的最小值。 5、正…...
C#委托(delegate)的常用方式
C# 中委托的常用方式,包括委托的定义、实例化、不同的赋值方式以及匿名委托的使用。 委托的定义 // 委托的核心是跟委托的函数结构一样 public delegate string SayHello(string c);public delegate string SayHello(string c);:定义了一个公共委托类型 …...
【弹性计算】弹性裸金属服务器和神龙虚拟化(一):功能特点
弹性裸金属服务器和神龙虚拟化(一):功能特点 特征一:分钟级交付特征二:兼容 VPC、SLB、RDS 等云平台全业务特征三:兼容虚拟机镜像特征四:云盘启动和数据云盘动态热插拔特征五:虚拟机…...
小结:BGP 的自动聚合与手动聚合
BGP 的自动聚合与手动聚合 BGP 在大规模网络中,通常会进行路由聚合(Route Aggregation),即将多个更具体(更小)的路由前缀合并成一个更大(更粗略)的前缀,以减少 BGP 路由…...
CTF中pwn shellcode题目
CTF中pwn shellcode题目 下面是一些shellcode代码和绕过技巧。 一些只给payload或者exp一把梭 首先给出两个常用shellcode仓库,可以检索需要的shellcode shellcode databaseexploit-db 基础 基础shellcode shellcode asm(shellcraft.sh())生成指定函数 用法…...
Conda 环境搭建实战:从基础到进阶
在当今复杂多变的软件开发与数据科学领域,拥有一个稳定、可复现且易于管理的开发环境是项目成功的基石。Conda 作为一款强大的跨平台环境管理与包管理工具,为开发者提供了便捷高效的环境搭建与依赖管理解决方案。本文将深入探讨 Conda 环境搭建的实战技巧…...
深入解析:域名转换成 IP 地址的多种方式
深入解析:域名转换成 IP 地址的多种方式 在互联网的世界里,我们日常访问网站时输入的是易于记忆的域名,比如 “www.example.com”,但计算机之间通信实际上依靠的是 IP 地址。那么,域名是如何转换成 IP 地址的呢&#x…...
大模型function calling:让AI函数调用更智能、更高效
大模型function calling:让AI函数调用更智能、更高效 随着大语言模型(LLM)的快速发展,其在实际应用中的能力越来越受到关注。Function Calling 是一种新兴的技术,允许大模型与外部工具或API进行交互,从而扩…...
LeetCode:131. 分割回文串(DP Java)
目录 131. 分割回文串 题目描述: 实现代码与解析: 动态规划 原理思路: 131. 分割回文串 题目描述: 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。…...
计算机毕业设计SpringBoot+Vue.js贸易行业CRM系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
虚拟机中的指示命令
1. 复制文件:cp 源文件 目标文件(cp file1.txt file2.txt) 2. 复制文件夹:cp -r 源文件夹 目标文件夹(cp -r dir1 dir2) 3. 创建一个空的文件:touch file1.txt 4. 创建一个空目录&a…...
图像分类项目2:鸟类图像分类
1 数据集处理 1.1数据集下载 数据集来源:kaggle,网址:https://www.kaggle.com/,点击进入网站,左侧选择Datasets。 进入后搜索栏搜索关键词bird。此时出现很多数据集可以选择,推荐选择第一个或者第三个。…...
Redis数据结构-List列表
1.List列表 列表类型适用于存储多个有序的字符串(这里的有序指的是强调数据排列顺序的重要,不是升序降序的意思),列表中的每个字符串称为元素(element),一个列表最多可以存储2^32-1个元素。在R…...
启动你的RocketMQ之旅(三)-Producer启动和发送流程(上)
前言: 👏作者简介:我是笑霸final。 📝个人主页: 笑霸final的主页2 📕系列专栏:java专栏 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一…...
Unity UGUI SuperScrollView介绍
先铺垫一下ScrollView Unity中常用的ScrollView 是 Unity 中的一个常见 UI 组件,主要用于创建可滚动的视图。当内容超过其显示区域时,ScrollView 可以让用户通过滚动查看全部内容。它通常包含一个显示区域和一个内容区域,内容区域可以超过显…...
pandas 数据透视表
数据的透视表 数据的透视表: 使用函数 pivot_table( ) # 引用pandas import pandas as pd # pivot_table 使用 pd.pivot_table(data,values,index,aggfunc,fill_value,columns)参数1:data DataFrame的源数据参数2:values 要进行聚合操作的列参数3:index 进行分组…...
