摘要:本文了解了数据库相关的逻辑架构。
环境
Windows 10 企业版 LTSC 21H2
MySQL 5.7.40
1 架构图
架构图如下:
2 分层
2.1 连接层
最上层是与客户端连接相关的服务:
- 连接管理:负责接收客户端的连接请求,处理客户端的认证信息,验证用户是否有权限连接到数据库服务器。同时,还负责管理连接的生命周期,包括连接的建立以及最终的断开。
- 线程管理:为每个客户端连接创建一个专用线程来处理该连接的所有请求和响应。这些线程负责读取客户端发送的查询请求,将查询请求传递给后续的处理层,并将结果返回给客户端。
2.2 服务层
第二层架构主要完成大多数的核心服务功能:
- 查询解析与优化:解析器会将SQL语句进行词法和语法解析,检查语句是否符合MySQL的语法规则,并将其转换为内部的解析树结构。预处理器则对解析树进行进一步的处理,包括检查语句的语义是否正确,用户是否有足够的权限等。优化器会根据一些规则和算法,对查询语句进行优化,选择最合适的数据访问路径,以提高查询的执行效率。
- 缓存机制:包含查询缓存和结果集缓存。查询缓存会存储之前执行的查询语句及其对应的查询结果,当收到新的查询请求时,会先检查查询缓存中是否有相同的查询语句,如果有且其对应的表数据未发生变化,则直接返回缓存中的结果,从而提高查询效率。结果集缓存则是在存储过程和函数等执行时缓存结果集,以供后续调用时快速返回结果。
2.3 引擎层
存储引擎层负责数据的存储和提取:
- 事务处理:负责处理事务相关的操作,包括事务的提交和回滚。不同的存储引擎对事务的支持程度不同,例如InnoDB引擎支持事务的完整特性,而MyISAM引擎则不支持事务。
- 索引管理:负责创建、维护和使用索引,索引是数据库中用于快速检索数据的结构。不同的存储引擎支持不同类型的索引。
- 数据缓存:对频繁访问的数据进行缓存,以减少对磁盘的访问次数。当读取数据时,优先从缓存中获取,如果缓存中不存在,则从磁盘读取数据并将其放入缓存中,同时会根据策略管理缓存空间。
2.4 存储层
数据存储层主要将数据存储在文件系统上,并完成与存储引擎的交互:
- 数据存储与管理:负责将数据以特定的格式持久化存储在磁盘上,并负责数据的物理读写操作。不同的存储引擎有不同的数据存储格式和结构,例如InnoDB引擎采用聚簇索引的存储方式将数据和索引存储在一起,而MyISAM引擎则将数据和索引分开存储在不同的文件中。
- 文件系统交互:与底层的文件系统进行交互,处理数据文件的创建、打开、读写和关闭等操作。还会根据数据库的配置和存储引擎的要求,对文件的大小、增长方式等进行管理。
3 模块
3.1 Connectors
连接器支持多种编程语言与SQL建立连接和交互。
3.2 Management Serveices & Utilities
管理工具包含多种系统管理和控制工具。
3.3 Connection Pool
连接池用于接收客户端请求,验证客户端的连接,分配客户端线程,并将处理结果响应客户端,以及使用缓存优化查询性能。
3.4 SQL Interface
接口可以接收客户端SQL命令,返回客户端查询结果。
3.5 Parser
解析器可以验证和解析SQL命令,按照不同的操作类型进行分类,做出针对性的转发到后续步骤。
3.6 Optimizer
查询优化器可以对查询SQL进行优化,得出最优的策略,告诉后面的程序如何取得查询语句的结果。
3.7 Cache & Buffer
查询缓存可以将结果集缓存到内存中,与查询语句的哈希值对应,以后的查询如果命中缓存则直接返回缓存的结果。
3.8 Pluggable Storage Engines
插件式存储引擎提供了一系列标准的管理和服务支持,每个存储引擎都可以按照其需要开发不同的功能。存储引擎是基于表的,而不是基于数据库的。
3.9 File System
文件存储系统可以将数据永久保存到本地磁盘。
3.10 Files & Logs
文件和日志保存了执行的改动,用于进行数据恢复等操作。
4 执行流程
执行图示:
4.1 缓存
服务器先检查SQL语句是否命中了查询缓存,如果命中了缓存,立即返回缓存中的数据。如果没有命中缓存,则进入下一阶段。
注意:
- 只有相同的查询操作才会命中查询缓存。
- 如果查询请求中包含某些系统函数、用户自定义变量和函数、某些系统表,那这个请求就不会被缓存。
- 缓存系统会监测涉及到的每张表,如果该表的结构或者数据被修改,就会导致缓存失效并被删除。对于经常更新的数据库来说,查询缓存的命中率非常低。
4.2 解析
在解析阶段,数据库首先会检查SQL语句的语法和语义,然后将SQL语句转换为抽象语法树(AST),为后续的优化和执行做准备。
解析器对SQL语句进行语法分析和语义分析,并最终构建内部表示:
- 语法分析:检查SQL语句的语法是否正确,如果发现语法错误,解析器会立即返回错误信息,停止执行。
- 词法分析:将输入的SQL语句分解成单独的词法单元(Token),例如关键字、标识符、操作符等。
- 语法分析:根据词法单元构建抽象语法树(AST),表示SQL语句的结构。
- 语义分析:进一步检查SQL语句的逻辑正确性。
- 对象验证:确保所有引用的数据库对象(表、列、视图等)存在。
- 权限检查:验证用户是否有权限访问或操作这些对象。
- 数据类型检查:确保操作符和函数的使用符合数据类型的要求。
- 构建内部表示:在完成语法和语义分析后,解析器会将SQL语句转换为抽象语法树(AST)用于后续的优化和执行。
4.3 优化
优化器对SQL语句进行优化,目标是选择最佳的执行计划,以提高查询性能。
优化过程可以分为逻辑优化和物理优化:
- 逻辑优化:包括重新排列查询操作、消除冗余操作等。
- 谓词下推:将过滤条件尽可能先行应用,以减少处理的数据量。
- 连接重排:调整表连接的顺序,以优化查询性能。
- 物理优化:选择具体的执行策略,优化器会评估多个执行计划,选择代价最低的一个。
- 索引选择:选择最合适的索引,以加速数据检索。
- 连接算法选择:选择最优的连接算法(嵌套循环、哈希连接、合并连接等)。
4.4 执行
执行阶段是数据库实际运行优化后的执行计划的过程,最终生成查询结果。
可以分为三个阶段:
- 生成步骤:根据优化阶段选定的执行计划,数据库会生成具体的执行步骤。这些步骤通常包括扫描表、应用过滤条件、执行连接操作等。
- 执行步骤:数据库按照执行计划的步骤,逐步执行查询操作。每个操作都会生成中间结果,最终合并成查询结果返回给用户。
- 结果返回:执行完成后,数据库会将查询结果返回给用户。对于查询操作,数据库会以表格形式返回查询的结果集。对于修改操作,数据库会返回受影响的行数。
5 存储引擎
5.1 定义
数据库存储引擎是数据库底层软件组件,不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。
5.2 查看
MySQL提供了多个不同的存储引擎,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。
查看可用的数据库引擎和默认引擎:
1 | mysql> show engines; |
Support列的值表示引擎是否能使用:
- YES表示可以使用。
- NO表示不能使用。
- DEFAULT表示该引擎为当前默认的存储引擎。
5.3 种类
5.3.1 InnoDB存储引擎
InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期事务。此外,InnoDB还支持行级锁,适合高并发情况。
除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
5.3.2 MyISAM存储引擎
MyISAM提供了大量的特性,包括全文索引、压缩、空间函数等,但不支持事务和行级锁。
MyISAM拥有较高的插入和查询速度,是在数据仓储和其他应用环境下最常使用的存储引擎之一。
5.3.3 Memory存储引擎
Memory将数据存储到内存中,可以快速地访问数据,但不支持修改,并且重启以后数据会丢失。
Memory至少比MyISAM要快一个数量级,使用专业的内存数据库更快,如Redis数据库。
5.3.4 Archive存储引擎
Archive只支持插入和查询操作,在MySQL 5.1之前不支持索引。
Archive适合低访问量大数据等情况,比如日志和数据采集类应用。
5.4 选择
不同的存储引擎都有各自的特点,如表所示:
特点 | InnoDB | MyISAM | Memory | Archive |
---|---|---|---|---|
存储机制 | 64TB | 256TB | RAM | None |
锁机制 | 行锁 | 表锁 | 表锁 | 行锁 |
事务安全 | 支持 | |||
B树索引 | 支持 | 支持 | 支持 | |
哈希索引 | 支持 | 支持 | ||
全文索引 | 支持 | |||
数据缓存 | 支持 | 支持 | ||
支持外键 | 支持 | |||
数据可压缩 | 支持 | 支持 | ||
批量插入速度 | 低 | 高 | 高 | 非常高 |
可以根据以下的原则来选择MySQL存储引擎:
- 如果要提供提交和回滚,以及事务安全(ACID)能力,并要求实现并发控制,可以使用InnoDB引擎。
- 如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率。
- 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中,使用Memory引擎作为临时表,存放查询的中间结果。
- 如果只有插入和查询操作,可以选择Archive引擎,支持高并发的插入操作,但是本身并不是事务安全的。
使用哪一种引擎要根据需要灵活选择,一个数据库中多个表可以使用不同的引擎以满足各种性能和实际需求,使用合适的存储引擎将会提高整个数据库的性能。
5.5 对比
对比InnoDB引擎和MyISAM引擎:
对比项 | MyISAM | InnoDB |
---|---|---|
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,操作一条记录也会锁整个表,不适合高并发 | 行锁,操作时只锁某一行,不对其它行有影响,适合高并发 |
缓存 | 缓存索引,不缓存真实数据 | 缓存索引和真实数据,内存大小对性能有决定性的影响 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
默认安装 | Y | Y |
存储方式 | 使用.MYD格式存储数据,使用.MYI格式存储索引 | 使用.FRM格式存储数据和索引 |
条