MySQL基础架构示意图
- 客户端
- 服务层
- 连接器:管理连接,权限验证等
- 查询缓存:命中缓存则直接返回结果
- 分析器:语法分析、词法分析
- 优化器:执行计划生成,索引选择
- 执行器:操作引擎,返回结果
- 存储引擎层:存储数据,提供读写接口
- InnoDB(默认存储引擎)
- MyISAM
- Memory
有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 MySQL 异常重启了。
一条查询SQL执行流程
第一步:与【连接器】创建连接
连接器校验客户端的用户名和密码以及所拥有的权限
第二步:查询缓存
之前查询的数据以key-value的形式存在缓存中,sql语句为key,查询结果集为value,如果有值校验权限后直接返回缓存结果,如果查不到缓存,则继续后面的执行阶段
大多数情况下不建议使用缓存,因为缓存失败特别频繁,表中只要有更新操作,则与这个表相关的缓存都会被清除,如果更新频繁的话缓存的命中率很低,对于那种更新不频繁,比如配置表可以使用缓存
第三步:分析器分析SQL语句
首先进行词法分析,识别出关键字、字段、表名、查询条件等
其次再进行语法分析,构建语法树,校验输入的SQL是否满足MYSQL语法
第四步:优化器对SQL进行优化
优化器在表有多条索引时,决定使用哪条索引,或者多表联合索引时决定各个表的索引执行顺序
第五步:执行器选择调用引擎查询结果
首先验证对表的执行权限,如果没有则直接返回权限错误
调用执行引擎接口查询数据并返回
一条更新语句执行流程
- 与连接器创建连接,验证登录和权限
- 清除表对应的缓存
- 分析器分析SQL语句
- 优化器对SQL进行优化
- 执行器选择调用引擎
- 写入redo-log和bin-log日志