这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
MySQL架构
-
网络连接层:主要是指数据库连接池,会负责处理所有客户端接入的工作。
- mysql -h 127.0.0.1 -uroot -p123456//建立TCP连接半双工通信, -h表示MySQL所在的服务器IP地址,-u表示本次连接所使用的用户名,-p则代表着当前用户的账号密码
-
show processlist//命令查询所有正在运行的线程
- Id:当前线程的ID值,可以利用这个ID,使用kill强杀线程。
- User:当前线程维护的数据库连接,与之对应的用户是谁。
- Host:与当前线程保持连接关系的客户端地址(IP+Port)。
- db:目前线程在哪个数据库中执行SQL。
-
Command:当前线程正在执行的SQL类型,如:
- Create DB:正在执行创建数据库的操作。
- Drop DB:正在执行删除数据库的操作。
- Execute:正在执行预编译的SQL(PreparedStatement)。
- Close Stmt:正在关闭一个PreparedStatement。
- Query:正在执行普通的SQL语句。
- Sleep:正在等待客户端发送SQL语句。
- Quit:当前客户端正在退出连接。
- Shutdown:正在关闭MySQL服务端。
- Time:表示当前线程处于目前状态的时间,单位是秒。
-
State:表示当前线程的状态,有如下几种:
- Updating:当前正在执行update语句,匹配数据做修改操作。
- Sleeping:正在等待客户端发送新的SQL语句。
- Starting:目前正在处理客户端的请求。
- Checking table:目前正在表中查询数据。
- Locked:当前线程被阻塞,其他线程获取了执行需要的锁资源。
- Sending Data:目前执行完成了Select语句,正在将结果返回给客户端。
- Info:一般记录当前线程正在执行的SQL,默认显示前一百个字符,查看完整的SQL可以使用show full processlist;命令。
-
连接池——相当于Tomcat中的线程池,主要是为了复用线程、管理线程以及限制最大连接数的
-
最大连接数
- show variables like '%max_connections%'; 查询目前DB的最大连接数。
- set GLOBAL max_connections = 200; 修改数据库的最大连接数为指定值。
-
show status like "Threads%"; 查询MySQL本身对客户端的连接数的统计
- Threads_cached:目前空闲的数据库连接数。
- Threads_connected:当前数据库存活的数据库连接数。
- Threads_created:MySQL-Server运行至今,累计创建的连接数。
- Threads_running:目前正在执行的数据库连接数。
-
-
系统服务层:主要包含SQL接口、解析器、优化器以及缓存缓冲区四块区域。
-
SQL接口组件
-
SQL语句
- DML:数据库操作语句,比如update、delete、insert等都属于这个分类。
- DDL:数据库定义语句,比如create、alter、drop等都属于这个分类。
- DQL:数据库查询语句,比如最常见的select就属于这个分类。
- DCL:数据库控制语句,比如grant、revoke控制权限的语句都属于这个分类。
- TCL:事务控制语句,例如commit、rollback、setpoint等语句属于这个分类。
-
触发器——类似于Spring框架中的AOP切面
- 支持INSERT、UPDATE、DELETE三种事件触发
- 通过AFTER、BEFORE语句声明触发的时机,是在操作执行之前还是执行之后
-
-
解析器——类似java编译 juejin.cn/post/705753…
- 词法分析、语义分析、语法树生成
-
优化器
- 生成执行计划——选择最合适的索引,选择最合适的join方式等
- 当然,在这里其实有很多资料也会聊到,存在一个执行器的抽象概念,实际上执行器是不存在的,因此前面聊到过,每个客户端连接在MySQL中都用一条线程维护,而线程是操作系统的最小执行单位,因此所谓的执行器,本质上就是线程本身。
- 优化器生成了执行计划后,维护当前连接的线程会负责根据计划去执行SQL,这个执行的过程实际上是在调用存储引擎所提供的API。
-
缓存&缓冲
-
读取缓存
- 主要是指select语句的数据缓存(也包含一些权限缓存、引擎缓存等信息) MySQL会对于一些经常执行的查询SQL语句,将其结果保存在Cache中
-
对于Cache是否开启可通过命令查询
- show global variables like "%query_cache_type%";:查询缓存是否开启。
- show global variables like "%query_cache_size%";:查询缓存的空间大小。
-
show status like'%Qcache%'; 查询缓存相关的统计信息
- Qcache_free_blocks:查询缓存中目前还有多少剩余的blocks。
- Qcache_free_memory:查询缓存的内存大小。
- Qcache_hits:表示有多少次查询SQL命中了缓存。
- Qcache_inserts:表示有多少次查询SQL未命中缓存然后走了磁盘。
- Qcache_lowmem_prunes:这个值表示有多少条缓存数据从内存中被淘汰。
- Qcache_not_cached:表示由于自己设置了缓存规则后,有多少条数据不符合缓存条件。
- Qcache_queries_in_cache:表示当前缓存中缓存的数据数量。
- Qcache_total_blocks:当前缓存区中blocks的数量。
- 在高版本的MySQL中,移除了查询缓存区
-
写入缓冲
- 为了通过内存的速度来弥补磁盘速度较慢对数据库造成的性能影响。在数据库中读取某页数据操作时,会先将从磁盘读到的页存放在缓冲区中,后续操作相同页的时候,可以基于内存操作
- 一般来说,当你对数据库进行写操作时,都会先从缓冲区中查询是否有你要操作的页,如果有,则直接对内存中的数据页进行操作(例如修改、删除等),对缓冲区中的数据操作完成后,会直接给客户端返回成功的信息,然后MySQL会在后台利用一种名为Checkpoint的机制,将内存中更新的数据刷写到磁盘。
- 缓冲区 与存储引擎有关,不同的存储引擎实现也不同,如InnoDB的缓冲区叫做innodb_buffer_pool,而MyISAM则叫做key_buffer。
-
-
-
存储引擎层:这里是指MySQL支持的各大存储引擎,如InnoDB、MyISAM等。(开源——可拔插式)
- show variables like '%storage_engine%';查看当前所使用的引擎
- 是MySQL数据库中与磁盘文件打交道的子系统,不同的引擎底层访问文件的机制也存在些许细微差异,引擎也不仅仅只负责数据的管理,也会负责库表管理、索引管理等,MySQL中所有与磁盘打交道的工作,最终都会交给存储引擎来完成
-
文件系统层:涵盖了所有的日志,以及数据、索引文件,位于系统硬盘上。
- 基于机器物理磁盘的一个文件系统,其中包含了配置文件、库表结构文件、数据文件、索引文件、日志文件等各类MySQL运行时所需的文件
- 功能——与上层的存储引擎做交互,负责数据的最终存储与持久化工作。
-
日志模块
- ①binlog二进制日志,主要记录MySQL数据库的所有写操作(增删改)。
- ②redo-log重做/重写日志,MySQL崩溃时,对于未落盘的操作会记录在这里面,用于重启时重新落盘(InnoDB专有的)。
- ③undo-logs撤销/回滚日志:记录事务开始前[修改数据]的备份,用于回滚事务。
- ④error-log:错误日志:记录MySQL启动、运行、停止时的错误信息。
- ⑤general-log常规日志,主要记录MySQL收到的每一个查询或SQL命令。
- ⑥slow-log:慢查询日志,主要记录执行时间较长的SQL。
- ⑦relay-log:中继日志,主要用于主从复制做数据拷贝。
-
数据模块
- db.opt文件:主要记录当前数据库使用的字符集和验证规则等信息。
- .frm文件:存储表结构的元数据信息文件,每张表都会有一个这样的文件。
- .MYD文件:用于存储表中所有数据的文件(MyISAM引擎独有的)。
- .MYI文件:用于存储表中索引信息的文件(MyISAM引擎独有的)。
- .ibd文件:用于存储表数据和索引信息的文件(InnoDB引擎独有的)。
- .ibdata文件:用于存储共享表空间的数据和索引的文件(InnoDB引擎独有)。
- .ibdata1文件:这个主要是用于存储MySQL系统(自带)表数据及结构的文件。
- .ib_logfile0/.ib_logfile1文件:用于故障数据恢复时的日志文件。
- .cnf/.ini:MySQL的配置文件,Windows下是.ini,其他系统大多为.cnf。