1. 连接池(接待部门)
作用:管理客户端连接(线程复用避免频繁创建销毁)。
关键机制:
采用线程池处理并发请求(比如100个用户同时查询)。
认证你的用户名密码(`mysql.user`表权限校验)。
吐槽点:连接数过多会爆(`max_connections`参数控制)。
2. SQL接口(前台客服)
干了啥:接收你的SQL语句(`SELECT/INSERT`等),分类转发给后续部门。
有趣细节:
解析SQL语法(比如验证`WHERE`写法对不对)。
区分简单命令(如`SHOW DATABASES`直接处理)和复杂查询(需优化器介入)。
3. 查询缓存(临时备忘录)(MySQL 8.0已移除!)
历史作用:缓存`SELECT`结果(若表数据未变更,直接返回缓存)。
淘汰原因:
缓存命中率低(表一更新就失效)。
维护缓存反而增加开销。
4. 解析器(语法检查员)
核心任务:将SQL语句转为解析树(类似编译器的AST)。
典型错误:`You have an error in your SQL syntax...`就是它抛出的。
5. 优化器(智能调度官)
关键决策:生成执行计划(决定怎么查最快)。
例子:`SELECT * FROM user WHERE id=1 AND name='Alice'`
→ 优先用`id`索引(假设它区分度更高)。
黑科技:
成本估算(基于统计信息,如索引基数)。
可能选错计划(需`EXPLAIN`诊断)。
6. 执行引擎(工人团队)
协作模式:
调用存储引擎接口(如InnoDB)读写数据。
处理临时表、排序等操作(如`ORDER BY`用到`sort_buffer`)。
7. 存储引擎(仓库管理员)(插件式架构,可替换!)
InnoDB(默认)核心设计:
缓冲池(Buffer Pool):高频数据的内存缓存(减少磁盘IO)。
事务支持:通过undo log(回滚)、redo log(崩溃恢复)实现ACID。
锁机制:行锁、间隙锁(解决并发冲突)。
对比MyISAM:不支持事务,但全文索引快(适合读多写少场景)。
8. 日志系统(审计追踪员)
关键日志:
Binlog(归档日志):主从复制的核心(逻辑日志,记录SQL语句)。
Redo Log(重做日志):确保事务持久性(物理日志,循环写入)。
Undo Log(回滚日志):实现事务原子性(记录数据修改前的值)。
数据流动示例(一条UPDATE语句)
1. 客户端发送`UPDATE products SET price=99 WHERE id=10`。
2. 解析器检查语法,优化器决定走`id`主键索引。
3. InnoDB先查Buffer Pool:
命中则直接修改内存数据页。
未命中则从磁盘加载到Buffer Pool。
4. 记录undo log(为回滚做准备),修改内存数据。
5. 生成redo log(`prepare`状态)。
6. 写binlog(用于复制/时间点恢复)。
7. redo log标记`commit`,事务完成。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程