MySQL 架构详解
Categories: Database / MySQL
MySQL 架构
客户端 mysql:使用 mysqlconn 库可以在编程语言中使用 SQL
服务端 mysqld:连接层,server 层,存储引擎层
连接层
负责客户端连接请求的监听与建立,还包括安全权限认证,连接管理和线程管理。
最大连接数由参数控制,当达到最大连接时,新的连接请求会被拒绝。
wait_timeout 参数控制客户端连接自动断开的时间。
线程管理分为每个连接一个线程和线程池两种模式,由参数 thread_handing 控制,支持在线修改。线程池调度固定数量的线程处理客户端的请求,避免线程频繁创建,切换,销毁的开销。
服务层
查询缓存 (query_cache)
query_cache 是一个内存的 kv,key 是执行过的 SQL,value 是查询的结果。执行一个 SQL 之前先在看是否命中查询缓存,是则返回,不是的话再执行完成后,查询结果会被缓存起来。
需要注意的是:query_cache 失效非常频繁,只要对一个表的更新就会导致该表上的所有 query_cache 失效
SQL 解析器 (Parser)
parser 负责对 SQL 语句进行词法分析和语法分析。
词法分析:将 SQL 中字符串识别为数据库中的结构
语法分析:检查该 SQL 是否符合语法要求
优化器 (Optimizer)
optimizer 负责生成执行计划,交给执行器执行。
在一个表有多个 index 的时候选择走哪个 index;执行 join 时选择 join 的类型,如 hash join 还是 merge join 等;join 的顺序;决定谓词的所在的位置等等。
执行器
根据执行计划执行语句。首先需要判断该用户是否对查询的表有查询权限,没有返回权限问题,有则打开该表进行查询。
执行器一般调用存储引擎的接口直接拿到表的一行数据。
分为没有索引和走索引的查询
存储引擎层
Buffer Pool
在内存中缓存表的数据页和索引页,加快访问速度。buffer_pool 的 innodb_buffer_size 由参数控制,当放不下所有的数据页时需要使用淘汰算法(LRU 等)替换一些页
Log Buffer
缓存事务的 redo log,保证事务的持久性。在 FORCE 模式下需要在事务提交时将事务的 log flush 到磁盘上持久化。FORCE 模式对应参数 innodb_flush_log_at_trx_commit = 1
buffer 大小受参数 innodb_log_buffer_size 控制
自适应 hash 索引
加速索引的查询速度,innodb 根据查询频率和模式建立 hash 索引,根据 hash 索引快速(O(1) 时间)定位到数据位置,比查询 b+ 树快。
物理文件
分为数据文件,索引文件,日志文件,临时文件
数据文件,索引文件和临时文件都是由一个 or 多个固定大小的页组成,页大小一般 16KB
日志文件用于存储日志,由两个或多个固定大小的日志段组成,保证事务的持久性
临时文件一般是查询过程中产生的中间结果,eg:临时表,sort 后的结果等