【mysql-1】mysql架构原理
一:mysql体系架构
1、client端
与mysql服务端建立连接,常见有java,C等,通过各自的api技术实现连接。
2、server端
- 连接池: 管理客户端与mysql的连接,一个线程管理一个。
- 系统管理和控制工具: 负责系统层面的东西,如: 备份恢复,安全和集群管理等。
- sql接口: 用于接收sql命令,返回结果。
- 解析器: 对接收的sql解析,生成解析树,校验解析树是否合法。
- 查询优化器: 验证合法后,交给优化器调优,然后与存储引擎交互,操作数据。
- 缓存: 由一系列小缓存组成,缓存查询结果,提升效率。
3、存储引擎
与底层系统文件交互,负责数据的存储和提取。 mysql存储引擎是插件式的,上层通过接口与之通信,避免不同引擎间的差异。 常见的如:MyISAM和InnoDB
4、系统文件
数据文件:
- db.opt文件:记录当前库默认使用的字符集和校验规则。
- frm文件:存储与表相关的元数据(meta)信息,比如:表结构的定义。 一张表对应一个frm。
- MyISAM专用文件
- MYD文件: 存放表数据,一张表一个
- MYI文件:存放索引相关信息,一张表一个
- InnoDB专用文件
- ibd文件:独立表空间数据,存放每张表的数据,索引等。
- ibdata文件: 系统表空间数据,如表的元数据,Undo日志等。
- ib_logfifile文件: redo log日志文件
日志文件:
- 错误日志:记录错误信息。show variables like '%log_error%';
- 通用查询日志: 记录查询语句。show variables like '%general%';
- 二进制日志binary log:记录增删改的sql,用于数据恢复和主从复制
show variables like '%log_bin%'; // 是否开启show variables like '%binlog%'; // 参数查看show binary logs;// 查看日志文件- 慢查询日志
记录所有执行时间超时的查询 SQL ,默认是 10 秒。show variables like '%slow_query%'; // 是否开启show variables like '%long_query_time%'; // 时长配置文件:
- 用于存放MySQL所有的配置信息文件,比如my.cnf、my.ini等
二:Mysql运行机制
了解了大体的架构之后,来看一下每一个环节的运行机制
1、建立连接
建立连接后,mqsql客户端与服务端采用 ‘半双工’ 的通信方式。 即同一时间,要么发送数据,要么接受数据。 另外,对于建立的每一个连接,都有一个线程状态标识连接正在做什么。
线程状态:show processlist;
- id:线程id
- user:启动线程的用户
- host:客户端的ip和端口
- db:命令在哪个库执行
- command: 在执行什么命令
- state:线程状态
- updating: 正在修改记录
- sleeping:等待客户端发送新的请求
- starting: 正在执行请求
- checking table:检查数据表
- closing table:表数据刷磁盘
- locked:当前操作的记录被其他查询锁住了
- sending data:在处理select
- info:记录执行的sql语句
2、查询缓存:执行查询后,会将sql语句和结果缓存起来,下次有相同的sql直接走缓存。
常用命令:
- show variables like '%query_cache%'; //查看查询缓存是否启用,空间大小,限制等
- show status like 'Qcache%'; //查看更详细的缓存参数,可用缓存空间,缓存块,缓存多少等
有一些条件不会作缓存:
- 查询语句使用SQL_NO_CACHE
- 查询的结果大于query_cache_limit设置
- 查询中有一些不确定的参数,比如now()
3、解析器: 将sql语句解析生成解析树,并校验是否合法。
4、查询优化器: