MySQL SQL语句执行过程详解
作为面试官,我来详细剖析一条SQL语句在MySQL中的完整执行过程,这是每个后端开发者都应该掌握的核心知识。
一、连接阶段
- 建立连接
- 客户端通过TCP/IP协议与MySQL服务器建立连接(默认3306端口)
- 服务器验证用户名、密码和权限
- 连接管理器创建线程处理该连接(线程池优化)
- 查询缓存(MySQL 8.0已移除)
- 如果是SELECT语句,先检查查询缓存
- 命中缓存则直接返回结果(缓存key是完整SQL)
- 注意:表数据变更加粗样式会使相关缓存失效
二、解析与优化阶段
- 解析器处理
- 词法分析:将SQL拆分为token(关键字、标识符等)
- 语法分析:检查SQL是否符合语法规则
- 生成解析树(语法树)
- 预处理器
- 检查表和列是否存在
- 检查权限
- 视图展开等转换操作
- 查询优化器
- 基于成本优化(CBO)选择最优执行计划加粗样式
- 考虑因素:索引、表大小、JOIN顺序等
- 生成执行计划(可通过EXPLAIN查看)
三、执行阶段
- 执行引擎处理
- 调用存储引擎API执行计划
- 不同存储引擎(如InnoDB)实现不同
- InnoDB引擎处理流程
- 缓冲池(Buffer Pool)检查:首先检查所需数据页是否在内存中
- 磁盘读取:若不在缓冲池,从磁盘加载数据页到内存
- 锁机制:根据隔离级别加锁(共享锁/排他锁)
- 事务处理:写入undo log(用于回滚)和redo log(用于恢复)
- 返回结果:将结果集放入网络缓冲区
四、返回结果
- 结果返回客户端
- 结果集通过网络协议返回
- 客户端逐步接收并处理数据
- 连接保持或关闭(取决于配置)
MySQL存储引擎区别详解
一、MySQL主要存储引擎
- InnoDB (MySQL 5.5+默认引擎)
- MyISAM (MySQL 5.5前默认引擎)
- MEMORY (内存引擎)
- ARCHIVE (归档引擎)
- CSV (CSV文件引擎)
- BLACKHOLE (黑洞引擎)
- FEDERATED (联邦引擎)
- MERGE (MyISAM集合引擎)
二、核心引擎对比(InnoDB vs MyISAM)
特性 | InnoDB | MyISAM |
---|---|---|
事务支持 | 支持ACID事务 | 不支持 |
锁粒度 | 行级锁 | 表级锁 |
外键支持 | 支持 | 不支持 |
崩溃恢复 | 有redo log保证 | 无保证 |
MVCC | 支持多版本并发控制 | 不支持 |
存储限制 | 64TB | 256TB |
缓存机制 | 缓冲池缓存数据和索引 | 只缓存索引 |
全文索引 | MySQL 5.6+支持 | 支持 |
压缩表 | 支持 | 支持 |
适用场景 | OLTP、高并发写 | OLAP、读密集型、数据仓库 |
三、引擎特点
引自腾讯云 MySQL 的存储引擎有哪些?它们之间有什么区别?
- InnoDB
- 事务支持:InnoDB 是默认的存储引擎,支持事务处理(ACID 属性)。
- 行级锁:使用行级锁,适合高并发环境。
- 外键支持:支持外键约束。
- 崩溃恢复:具有自动崩溃恢复功能。
- 性能:在读写混合加粗样式负载下表现良好。
- 存储:数据存储在表空间中,支持表空间的动态扩展加粗样式。
- MyISAM
- 不支持事务:不支持事务处理。
- 表级锁:使用表级锁,不适合高并发写操作。
- 全文索引:支持全文索引,适合搜索引擎等应用。
- 性能:在只读或读多写少的场景下性能较好。
- 存储:数据存储在磁盘文件中,每个表对应一个 .MYD 文件(数据文件)和一个 .MYI 文件(索引文件)。
- Memory
- 内存存储:数据存储在内存中,速度快但不持久。
- 临时数据:适合存储临时数据,如缓存、中间结果等。
- 不支持事务:不支持事务处理。
- 表级锁:使用表级锁。
- 性能:在需要高速读取的场景下性能非常好。
- Archive
- 压缩存储:数据以压缩格式存储,占用空间小。
- 只读:主要用于归档和日志记录,不支持更新操作。
- 不支持索引:不支持索引,查询性能较差。
- 性能:适合存储大量历史数据,节省存储空间。
- CSV
- CSV 文件:数据存储在 CSV 文件中,可以直接用文本编辑器打开。
- 简单:适合简单的数据导入导出操作。
- 不支持事务:不支持事务处理。
- 性能:性能较低,不适合大规模数据操作。
- Blackhole
- 黑洞存储:所有写入的数据都会被丢弃,不实际存储任何数据。
- 日志记录:主要用于测试和日志记录。
- 性能:写操作非常快,因为数据实际上没有被存储。
- Federated
- 远程表:允许访问其他 MySQL 服务器上的表,实现分布式数据库。
- 性能:性能受网络延迟影响较大。
- 不支持事务:不支持事务处理。
- Merge
- 合并多个表:可以将多个 MyISAM 表合并成一个逻辑表。
- 性能:适合需要对多个表进行统一查询的场景。
- 不支持事务:不支持事务处理。
https://github.com/0voice