原文引用
Mysql架构组成
整体架构:
连接层
客户端连接线程管理
每个请求都对应一个执行线程,该线程处理连接的身份验证和具体请求。执行线程使用线程池技术
进行缓存,当一个请求需要处理时,先从线程池中查找是否有可用的线程,如果没有则新创建一个,当连接结束时,如果线程池没有满,则把当前线程放入线程池,主要的作用是提高线程的复用,减少创建线程造成的系统开销从而提高效率。
- thread_cache_size (系统变量):线程池缓存的大小,服务器在启动时会自动调整大小,值为0时禁用缓存,此时为每个新连接创建执行一个线程,并在连接断开时释放;
- thread_stack:调整线程堆栈大小,有些复杂的SQL语句在执行过程中可能会有深层递归从而消耗更多的内存。
线程需要管理:数据库查询、存储过程、事务处理等操作:查询涉及很多函数调用和数据处理,每个函数都会在堆栈中占用一些空间。如果线程堆栈的大小不够,就会导致程序崩溃或者错误。
问题1: 线程需要管理数据库查询!查询时候这个线程堆栈里面存储了什么?肯定不是数据结果集吧!根本放不下啊!
解答1: 查询时线程堆栈里存储的内容:
- 函数调用链
- 局部变量
- 返回地址
- 函数参数
问题2: 那么,结果集存储在哪里?
解答1: 存储在 MySQL 的内存池或临时文件中,取决于结果集的大小和配置。
- 小的结果集:可能直接存储在内存中(通常是缓冲区)。
- 大的结果集:如果结果集非常大,MySQL 可能会将其写入磁盘的临时文件,以节省内存。
连接器管理
- max_connections(系统变量):可以控制服务器允许同时连接的最大客户端数,当服务器达到max_connections 指定的连接数时会拒绝所有新的连接请求,同时会增加状态变量Connection_errors_max_connections 的值;
- 实际上允许 max_connections+1个客户端连接。额外的连接为拥有CONNECTION_ADMIN 权限的帐户(管理员)使用,即使普通连接达到了 max_connections 的数量,管理员也可以连接到服务器进行管理操作;
- 在部署为主从复制的环境中,从节点的连接数也会计入 max_connections 中,如果连接达到上限主从复制将会失败;
服务层
核心:Parser(语法分析器)
语法分析器的主要作用是将客户端发来的SQL语句中的关键字和自定义字段进行提取、解析,最终将 SOL语句转换为一棵解析树:
- 词法分析:主要是对关键字进行提取,比如 select/update/delete/create…
- 语法分析:主要判断 SQL 语句是否满足语法规则,如果语法错误则异出异常,也就是我们常见的ERROR 1064(42000):You have anerror in your SOL syntax。
核心:Optimizer(查询优化器)
通过语法校验的SQL语句将进入查询优化器处理阶段,查询优化器会将解析树转化为查询计划
,一般情况下,一条查询可以有很多种执行方案,查询优化器会根据执行计划匹配合适的索引,选择最佳的执行方案,最终把确定要执行的SOL交给执行器调用存储引擎API。
核心: SQL语句的执行流程
存储引擎
InnoDB
特点:
- 事务支持:InnoDB 支持 ACID(原子性、一致性、隔离性、持久性)事务,这使得它非常适合需要事务处理的应用场景。
- 外键支持:InnoDB 支持外键约束,可以确保数据的完整性和一致性。
- 行级锁定:InnoDB 采用行级锁定(Row-level Locking),可以更好地处理并发,
适合高并发写入的场景
。 - 崩溃恢复:InnoDB 具有自动崩溃恢复功能,通过
重做日志(redo log)
在系统崩溃后恢复数据。 - 表空间管理:InnoDB 会将数据和索引存储在表空间中,可以是共享表空间,也可以是单独的表空间文件。
应用场景:
- 需要事务处理的系统:如金融系统、电商平台等,要求
数据一致性和安全性
,适合使用 InnoDB。 - 高并发写入的系统:如社交网络、在线游戏等,需要
频繁读写操作
的应用,InnoDB 的行级锁定能减少锁冲突。 - 有外键约束的应用:如复杂的关系型数据库系统,需要确保数据之间的关联性和完整性。
MyISAM
特点:
- 无事务支持:MyISAM 不支持事务和外键约束,因此数据一致性和完整性依赖于应用程序的实现。
- 表级锁定:MyISAM 采用表级锁定(Table-level Locking),在
写操作时会锁定整个表(串行操作-读写互斥)
,因此在高并发写入时可能会出现性能瓶颈。 - 存储效率高:MyISAM 的存储结构比较简单,通常在
读取密集型操作
中表现良好,数据存储和索引占用的空间较小(以读,检索数据为主)。 - 全文索引支持:MyISAM 提供了对全文索引的支持,这在文本搜索方面有优势。
- 崩溃恢复较弱:MyISAM 没有像 InnoDB 那样的自动崩溃恢复功能,崩溃后可能需要手动修复表。
应用场景:
- 读多写少的应用:如内容管理系统(CMS),数据主要以读为主,MyISAM 的表级锁定不会对性能造成太大影响。
- 全文检索的应用:如博客系统、文档管理系统等,需要快速进行全文搜索,MyISAM 提供了高效的全文索引。
- 存储需求低的应用:MyISAM 的存储效率高,可以在不需要事务支持的小型应用或数据量较少的场景下使用。
文件系统
- 数据目录:
datadir参数来指定数据目录的位置
- 配置文件(my.cnf 或 my.ini)
- Unix/Linux系统:通常是/etc/my.cnf或/etc/mysql/my.cnf
- Windows系统:通常是C:\ProgramData\MySQL\MySQL Server x.x\my.ini
- 日志文件
- 错误日志(Error Log)
- 查询日志(General Query Log):记录所有执行的SQL语句,默认未开启。可以通过general_log和general_log_file参数开启并指定文件名。
- 慢查询日志(Slow Query Log):记录执行时间超过指定阈值的SQL语句,用于优化查询性能。可以通过slow_query_log和slow_query_log_file参数开启并指定文件名。
- 二进制日志(Binary Log):记录所有更改数据的SQL语句,用于数据恢复和主从复制。默认文件名是hostname-bin。