目录
- 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