本文共 6013 字,大约阅读时间需要 20 分钟。
mysql基础架构图
MySQL基架大致包括如下几大模块组件简介:(1)MySQL向外提供的交互接口(Connectors) Connectors组件,是MySQL向外提供的交互组件,如java,.net,php等语言可以通过该组件来操作SQL语句,实现与SQL的交互。 (2)管理服务组件和工具组件(Management Service & Utilities) 提供对MySQL的集成管理,如备份(Backup),恢复(Recovery),安全管理(Security)等 (3)连接池组件(Connection Pool) 负责监听对客户端向MySQL Server端的各种请求,接收请求,转发请求到目标模块。每个成功连接MySQL Server的客户请求都会被创建或分配一个线程,该线程负责客户端与MySQL Server端的通信,接收客户端发送的命令,传递服务端的结果信息等。 (4)SQL接口组件(SQL Interface) 接收用户SQL命令,如DML,DDL和存储过程等,并将最终结果返回给用户。 (5)查询分析器组件(Parser) 首先分析SQL命令语法的合法性,并尝试将SQL命令分解成数据结构,若分解失败,则提示SQL语句不合理 (6)优化器组件(Optimizer) 对SQL命令按照标准流程进行优化分析。 (7)缓存主件(Caches & Buffers) 缓存和缓冲组件 (8)插件式存储引擎(Pluggable Storage Engines) mysql存储引擎 (9)物理文件(File System) 实际存储MySQL 数据库文件和一些日志文件等的系统,如Linux,Unix,Windows等
级别 | 原文 | 备注 |
---|---|---|
表空间 | tablespace | 对应ibd文件和frm文件 |
段 | segment | 一个索引2个段 |
镞 | Extent | 1MB,由64个连续的页构成 |
页 | Page | InnoDB磁盘I/O的最小单位16KB:64个page=1个Extent |
行 | row | |
字段 | Field |
表空间
页
类型 | 描述 |
---|---|
数据页 | B-tree Node |
Undo 页 | Undo Log Page |
系统页 | System Page |
事务数据页 | Transaction system Page |
插入缓冲位图页 | Insert Buffer Bitmap |
插入缓冲空闲列表页 | Insert Buffer Free List |
未压缩的二进制大对象页 | Uncompressed BLOB Page |
压缩的二进制大对象页 | Compressed BLOB Page |
查询语句执行流程示意图
通信协议
MySQL 支持多种通信协议,可以使用同步/异步的方式,支持长连接/短连接
我们采用异步长连接的形式
大部分时候我们用的是同步。异步有什么特点? 1、异步不能节省 SQL 执行的时间 2、如果异步存在并发,每一个 SQL 的执行都要建立一个连接,避免数据混乱。但是这样会给服务端 带来巨大的压力(一个连接就会创建一个线程,线程间切换会占用大量 CPU 资源)。另外异步通信还带来了编码的复杂度,所以一般不建议使用。 如果要异步,必须使用连接池,排队从连接池获取连接而不是创建新连接。
交互时间
show global variables like 'wait_timeout'; (非交互式超时时间,如 JDBC 程序) show global variables like 'interactive_timeout'; (交互式超时时间,如数据库工具) 默认都是 28800 秒,8 小时。 netstat -an|grep 3306|wc -l 查看 MySQL 当前有多少个连接 show variables like 'max connections';,查看MySQL 默认的连接数是 151 个,最大是 16384(2^14)。
查询缓存
在 MySQL 8.0 中,查询缓存已经被移除了语法解析和预处理
词法解析
词法分析就是把一个完整的 SQL 语句打碎成一个个的单词。 比如一个简单的 SQL 语句: select name from user where id = 1; 它会打碎成 8 个符号,每个符号是什么类型,从哪里开始到哪里结束。语法解析
查询优化
查询优化器的目的就是根据解析树生成不同的执行计划,然后选择一种最优的执行计划,MySQL 里面使用的是基于开销(cost)的优化器,那种执行计划开销最小,就用哪种EXPLAIN select name from user where id=1; 查看执行计划语句
存储引擎
在 MySQL 里面,支持多种存储引擎,他们是可以替换的,所以叫做插件式的存储引常见存储引擎
1、InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。2、MyISAM:占用空间小,查询速度快。缺点是不支持事务的完整性和并发性。
3、MEMORY:所有的数据都在内存中,处理速度快,但是安全性不高。对表的大小有要求,依赖内存,不能建立太大的表。
执行引擎
利用存储引擎提供了相应的 API 来完成操作。为什么我们修改了表的存储引擎,操作方式不用变?因为不同功能的存储引擎实现的 API 是相同的。最后把数据返回给客户端,即使没有结果也要返回。更新语句执行流程图下图所示
InnoDB 引入了一个日志文件,叫做 redo log 重做日志(数据目录下的 ib_logfile0 和 ib_logfile1,每个48M)。
我们把所有对内存数据的修改操作写入日志文件,如果服务器出问题了,我们就从这个日志文件里面读取数据,恢复数据——用它来实现事务的持久性。
这种日志和磁盘配合的整个过程,其实就是 MySQL 里的 WAL 技术(Write-Ahead Logging),它的关键点就是先写日志,再写磁盘。
redo log 有什么特点?
1、不是记录数据页更新之后的状态,而是记录这个页做了什么改动,属于物理日志。 2、redo log 的大小是固定的,前面的内容会被覆盖。 注意 redo log 是 InnoDB 存储引擎实现的,并不是所有存储引擎都有。
缓冲池主要分为 4 个部分: Buffer Pool、(redo)log buffer、Change Buffer、Adaptive Hash Index。
Buffer Pool
Buffer Pool 由包含数据页(data page)、索引页(data page)等的缓冲数据。InnoDB 用 LRU 算法(Leastrecently Used)来管理缓冲池(不是传统的 LRU,分成了 young 和 old),经过淘汰的数据就是热点数据。show VARIABLES like '%InnoDB_buffer_pool%'; Buffer Pool 默认大小是 128M。
Change Buffer
注意:旧版本中叫 Insert Buffer。Log Buffer
Redo log 一样也不是直接写入磁盘文件的,而是有一个缓冲,Redo Log Buffer 用来优化 redo log 的性能。大小由下面这个参数决定:show variables like '%innodb_log_buffer_size%'; 默认 16M
Adaptive Hash Index
InnoDB 存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则热点页建立哈希索引,来提高查询效率系统表空间 system tablespace
InnoDB 系统表空间包含 InnoDB 数据字典和双写缓冲区、Change Buffer 和 Undo Logs),也包含用户创建的表和索引数据(没有指定 file-per-table 时)。属于共享表空间。对应于 ibdata1 文件。独占表空间 file-per-table tablespaces
包含单个 InnoDB 表的数据和索引,并存储在文件系统中自己的数据文件中(tbl name.ibd)通用表空间 general tablespaces
通用表空间也是一种共享的表空间,跟 ibdata1 类似。 可以创建一个通用的表空间,用来存储不同数据库的表,数据路径和文件可以自定义。create tablespace ts2673 add datafile 'ts2673.ibd' file_block_size=16K engine=innodb; # 创建通用表空间
临时表空间 temporary tablespaces
存储临时表的数据,对应数据目录下的 ibtmp1 文件。当数据服务器正常关闭时,该表空间被删除,下次重新产生转载地址:http://zaqms.baihongyu.com/