整体架构
-
连接层:负责接入工作 MYSQL基于TCP建立的网络连接,但是和客户端之间是
半双工的通信机制 MYSQL会建立一个连接池(线程),每个连接都由一个线程去处理对应的请求show processlist : 查看线程状态,也就等于连接状态 max-connections:最大线程数,可以配置 Threads% :MYSQL统计连接数,通过
show status like"Threads%" 查看 一般来说客户端也会建立一个连接池,如Java的druid,这里是维护和数据库的连接避免断开,每次连接的建立都要经历3次握手,连接池实现连接的复用 -
服务层:接受连接后提供服务,SQL接口统一为入口处理服务
-
存储引擎:给服务层提供服务,完成对数据
-
文件系统:主要指MQSQL自定义的文件结构,也包含了操作系统文件系统,我更倾向于这一层是操作系统的文件系统,MYSQL通过OS文件系统去完成数据的持久化工作,这些数据包含了MYSQL的定义都各种文件,日志和数据等
服务层
SQL语句类型
- DML: 管理语句,已经建好表了,用于表中数据管理,粒度是行,update,delete,insert
- DDL: 定义语句,用于管理表,粒度是表级别,create,alter,drop
- DQL:查询语句,select
- DCL:控制语句,权限控制,grant,revoke
- TCL:事务控制语句,commit,rollback,setpoint
客户端建立连接后,一条SQL语句执行会依次经历 :SQL接口->解析器->优化器->缓存
- 有的SQL会不需要缓存
- 有的SQL可能走到接口就能拿到结果,如select语句缓存命中,就不会走后续流程
服务层组件
- SQL接口:接收SQL负责分发其他组件,然后处理数据返回值
- 解析器:解析SQL语句,转换数据库指令
- 优化器:优化解析器指令执行顺序,找到最佳执行结果
- 缓存:各种缓存数据,如果命中了,就不会走存储引擎执行具体IO操作 %query_cache_type%:缓存是否开启的变量 %query_cache_size%:缓存大小的变量 %Qcache%:缓存相关统计信息,
show status like "%Qcache%"高版本后的MYSQL取消了SELECT的查询缓存,因为命中率很低。
存储引擎
数据具体的组织由存储引擎来完成
- 数据的读写
- 数据怎么存
- 索引的实现
主流存储引擎:InnoDB,MyISAM
- show variables like "%storage_engine%" : 查看当前使用的存储引擎
文件系统
主要是mysql的设计的文件类型
- 日志模块:以下是常用/常听到的日志 bin-log:mysql记录所有读写操作的文件,用于备份 redo-log:innodb引擎的日志,记录重写/重做的日志,用于崩溃后恢复 undo-log:innodb引擎的日志,用于实现事务,如回滚等操作都基于undo-log slow-log:记录慢SQL的日志,需要配置。 error-log:错误日志
- 数据模块:以下是innodb .ibd:表数据和索引信息,每个表都有 .ibdata1:InnoDB的默认表空间文件,用于存储InnoDB的数据 具体的索引是放在idb和idbdata1看配置。
SQL执行流程
客户端程序从客户端连接池获取连接的流程:
如果没有获取到连接就尝试和MQSQL创建新连接,MYSQL收到TCP连接请求后,进行三次握手后流程:
- 校验用户信息:用户,密码
- 绑定工作线程:检查连接池是否有空闲线程,有就绑定,没有就尝试创建(没有达到最大连接数)
- 权限查询:绑定完毕,工作线程查询用户权限,方便后续使用,每次执行对应SQL,工作线程都会检查权限
查询语句
- SQL接口:通过sql语句hash后查询缓存,同时处理存储引擎返回结果 如:
limit字段的处理是由SQL接口去执行的,一旦数据达到要求立即停止处理排序,聚合都是SQL接口处理 - 解析器:语法合规性检查
- 优化器:选择最优执行方案
效率最高的条件字段放前面选择效率最高的索引多表联查选效率最高表先执行 - 存储引擎:调用操作系统接口查询对应的存储文件数据
写入/修改
阅读
竹子爱熊猫的MYSQL专栏的文章整理的笔记。