Stay hungry, stay foolish.

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 后的结果等

Read More

网络优化 - 构建足够快的网络服务

【2024-12-03】深入探讨网络服务优化的各个方面,包括延迟指标、HTTPS优化、域名解析、传输内容压缩、SSL优化、网络拥塞控制、QUIC协议等