【mysql-1】mysql架构原理

一:mysql体系架构

【mysql-1】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.cnfmy.ini

 

二:Mysql运行机制

了解了大体的架构之后,来看一下每一个环节的运行机制

【mysql-1】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、查询优化器: