Mysql基础
主要是讲mysql的基础构成还有一些sql的原理,本文中也有对部分网上文章、课程的总结回顾,在末尾处会贴出链接,也会有些自己总结的流程图归纳,欢迎交流讨论
基本架构
@startuml
autoactivate on
group 服务器server层
client->连接器: 获取数据库连接
autonumber 1.1
连接器->查询缓存: 查询是否有缓存数据
note over of 查询缓存: 8及以上版本已移除
查询缓存->连接器: 若内存中有,则返回数据
autonumber 2.1
连接器->分析器: 如果查询缓存没有,则语句语法解析
分析器->优化器: 执行计划生成、索引选择
优化器->执行器: 操作引擎,返回结果
end group
group 引擎层
autonumber 3
执行器->存储引擎: 调用实际存储数据,执行读写
note over of 存储引擎: 常见的有MyISAM、InnoDB、Memory
end group
@enduml
查询缓存
对于写压力大的业务,频繁更新缓存压力大,且带来收益不大,每次对表的更新,都会触发表的查询缓存全部清空
8.0中移除了这个模块
优化器
生成执行计划时,会决定sql的执行方式,比如常见的当查询条件涉及两个索引or两张表时,优先从哪个索引、哪张表上进行查询,都会在这步进行生成
执行器
- 权限校验
- 调用存储引擎获取数据,如果遇到符合条件的加入结果集,直到满足查询条件后,将结果集返回给client
更新实现方式
架构
autoactivate on
autonumber 1.1
group 找到要更新的数据
client->执行器: 更新语句
执行器->InnoDB: 调用引擎更新
InnoDB->内存: 查询当前行是否在内存中
内存->磁盘: 如果不存在,则会把对应行的页数据加载进缓存
磁盘->内存: 加载数据
内存->InnoDB: 返回对应行
end group
group 更新到内存
autonumber 2.1
InnoDB->内存: 对应行数据做更新,并写入内存
end group
group WAL(write-Ahead-logging)写日志
autonumber 3.1
InnoDB->redolog: 将数据写入redoLog,目前事务处于prepare阶段
InnoDB->MyISAM: 写入binLog
note over of MyISAM: MySQL默认自带引擎是MyISAM,这个日志主要做归档使用,而redoLog是InnoDB引入的,借助这个才实现了crash-safe的功能
end group
TODO 待继续补充 2023-06-18