产品与运行架构
MySQL Server 通过协议接收客户端请求,完成认证、解析、优化和执行,再通过存储引擎接口访问表。SQL 能否执行、如何访问数据和事务能否回滚,分别由不同层共同决定。
主要层次
| 层次 | 职责 |
|---|---|
| Connector | 协议、TLS、认证插件、连接参数和结果映射 |
| Connection/Thread | 建立会话、保存 Session 状态并执行请求 |
| Parser/Resolver | 检查语法、对象名、权限和表达式语义 |
| Optimizer | 根据统计信息和成本选择连接顺序、索引与执行策略 |
| Executor | 驱动执行计划并调用存储引擎接口 |
| Storage Engine | 实现数据页、索引、锁、事务和具体 I/O |
| Binary Log | 在 Server Layer 记录逻辑或行变化,用于复制和 PITR |
MySQL 8.x 已使用事务型数据字典,不再以旧版 .frm 文件作为表定义来源。旧教程中直接复制 .frm、.ibd 拼装表结构的恢复方式不适用于现代版本。
SQL 执行路径
text
接收 SQL
→ 解析并绑定对象
→ 读取权限与元数据
→ 生成候选访问路径
→ 根据统计和成本选择计划
→ 存储引擎访问索引或数据页
→ 排序、聚合、连接并返回结果逻辑书写顺序与概念处理顺序不同:
text
FROM / JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT这是理解别名可见范围和聚合语义的工具,不是优化器必须严格按该顺序物理执行的承诺。
连接与内存
MySQL 常见一个客户端连接对应一个服务线程或线程池执行单元。每个连接除了固定会话内存,还可能按执行节点申请 Sort、Join、Read Buffer 和临时表空间。
因此总内存不能只看 InnoDB Buffer Pool:
text
实例内存 ≈ 全局缓存 + 活跃连接私有内存 + 临时操作 + Performance Schema + 系统开销max_connections 提高并不会提升数据库处理能力,只会允许更多请求同时争用 CPU、内存、锁和 I/O。应用通常应使用有上限的连接池并设置连接、查询和事务超时。
存储引擎选择
| 引擎 | 定位 | 新业务判断 |
|---|---|---|
| InnoDB | ACID、MVCC、行锁、外键和崩溃恢复 | 通用业务默认选择 |
| MyISAM | 非事务、表级锁的遗留引擎 | 不因“查询快”而选用,通常只维护遗留系统 |
| MEMORY | 数据驻留内存,重启丢失 | 只适合可重建临时数据,不能替代缓存服务 |
| NDB | MySQL Cluster 的分布式存储引擎 | 独立产品架构,不能按普通 InnoDB 使用 |
MyISAM 并不天然比 InnoDB 查询快。真实性能取决于缓存、索引、并发、数据可靠性要求和工作负载;缺少事务与崩溃恢复通常使它不适合现代核心系统。