文章目录

  • 一、前言
  • 二、 MySQL应用架构
  • 1. 应用架构总体介绍
  • 1).网络连接层
  • 2).服务层
  • (1). 系统管理和控制工具
  • (2). 连接池
  • (3). SQL接口
  • (4). 解析器
  • (5). 查询优化器
  • (6). 缓存
  • 3).存储引擎层
  • 4).系统文件层
  • 三、 MySQL运行机制
  • 1. 建立连接
  • 2. 查询缓存
  • 3. 解析器
  • 4. 查询优化器
  • 5. 查询执行引擎


一、前言

本篇文章是MySQL详细的架构原理及优化的讲解,建议对MySQL有一定的基础再学习。

二、 MySQL应用架构

1. 应用架构总体介绍

mysql架构图 mysql架构体系_MySQL

上图是MySQL架构体系,从上到下依次是网络连接层服务层存储引擎层系统文件层


1).网络连接层

提供与MySQL服务器建立的支持,像Java,c,Python等


2).服务层

MySQL的核心部分,包括系统管理和控制工具、连接池、查询优化器、缓存、SQL接口、解析器六部分。


(1). 系统管理和控制工具

eg: 备份恢复、安全管理、集群
管理等

(2). 连接池

负责存储和管理客户端与数据库的连接,一个线程负责管理一个
连接。

(3). SQL接口

用于接受客户端发送的各种SQL命令,并且返回用户需要查询的结
果。比如DML、DDL、存储过程、视图、触发器等。

(4). 解析器

负责将请求的SQL解析生成一个"解析树"。然后根据一些MySQL规则进一步检查解析树是否合法

(5). 查询优化器

解析树通过解析器语法检查后,将交由优化器将其转化成执行计划,然后与存储引擎交互。

select uid,name from user where gender=1;
选取–》投影–》联接 策略
1)select先根据where语句进行选取,并不是查询出全部数据再过滤
2)select查询根据uid和name进行属性投影,并不是取出所有字段
3)将前面选取和投影联接起来最终生成查询结果

(6). 缓存

缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,权限缓存,引擎缓存等。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。


3).存储引擎层

存储引擎负责MySQL中数据的存储与提取,与底层系统文件进行交互。MySQL存储引擎是插件式的,服务器中的查询执行引擎通过接口与存储引擎进行通信,接口屏蔽了不同存储引擎之间的差异 。有很多种存储引擎,各有各的特点,最常见的是MyISAMInnoDB


4).系统文件层

该层负责将数据库的数据和日志存储在文件系统之上,并完成与存储引擎的交互,是文件的物理存储层。主要包含日志文件,数据文件,配置文件,pid 文件,socket 文件等。

日志文件

  • 错误日志(Error log)
    默认开启,show variables like ‘%log_error%’
  • 通用查询日志(General query log)
    记录一般查询语句,show variables like ‘%general%’;
  • 二进制日志(binary log)
    记录了对MySQL数据库执行的更改操作,并且记录了语句的发生时间、执行时长;但是它不记录select、show等不修改数据库的SQL。主要用于数据库恢复和主从复制。
    show variables like ‘%log_bin%’; //是否开启
    show variables like ‘%binlog%’; //参数查看
    show binary logs;//查看日志文件
  • 慢查询日志(Slow query log)
    记录所有执行时间超时的查询SQL,默认是10秒。
    show variables like ‘%slow_query%’; //是否开启
    show variables like ‘%long_query_time%’; //时长
  • 配置文件
    用于存放MySQL所有的配置信息文件,比如my.cnf、my.ini等。
  • 数据文件
  1. db.opt 文件:记录这个库的默认使用的字符集和校验规则。
  2. frm 文件:存储与表相关的元数据(meta)信息,包括表结构的定 义信息等,每一张表都有一个frm 文件。
  3. MYD 文件:MyISAM 存储引擎专用,存放 MyISAM 表的数据(data),每一张表都会有一个.MYD 文件。
  4. MYI 文件:MyISAM 存储引擎专用,存放 MyISAM 表的索引相关信息,每一张 MyISAM 表对应一个 .MYI 文件。
  5. ibd文件和 IBDATA 文件:存放 InnoDB 的数据文件(包括索引)。InnoDB 存储引擎有两种表空间方式:独享表空间和共享表空间。独享表空间使用 .ibd 文件来存放数据,且每一张InnoDB 表对应一个 .ibd 文件。共享表空间使用 .ibdata 文件,所有表共同使用一个(或多
    个,自行配置).ibdata 文件。
  6. ibdata1 文件:系统表空间数据文件,存储表元数据、Undo日志等
  7. ib_logfile0、ib_logfile1 文件:Redo log 日志文件。

三、 MySQL运行机制

如下图所示,是MySQL的运行机制。

mysql架构图 mysql架构体系_数据库_02

1. 建立连接

通过客户端/服务器通信协议与MySQL建立连
接。MySQL 客户端与服务端的通信方式是 半双工 。对于每一个 MySQL 的连接,时刻都有一个线程状态来标识这个连接正在做什么。

通讯机制:

  • 全双工:能同时发送和接收数据,例如平时打电话。
  • 半双工:指的某一时刻,要么发送数据,要么接收数据,不能同时。例如早期对讲机
  • 单工:只能发送数据或只能接收数据。例如单行道

线程状态:
show processlist; //查看用户正在运行的线程信息,root用户能查看所有线程,其他用户只能看自己的

  • id:线程ID,可以使用kill xx;
  • user:启动这个线程的用户
  • Host:发送请求的客户端的IP和端口号
  • db:当前命令在哪个库执
  • Command:该线程正在执行的操作命令

Create DB:正在创建库操作
Drop DB:正在删除库操作
Execute:正在执行一个PreparedStatement
Close Stmt:正在关闭一个PreparedStatement
Query:正在执行一个语句
Sleep:正在等待客户端发送语句
Quit:正在退出
Shutdown:正在关闭服务器

  • Time:表示该线程处于当前状态的时间,单位是秒
  • State:线程状态

Updating:正在搜索匹配记录,进行修改
Sleeping:正在等待客户端发送新请求
Starting:正在执行请求处理
Checking table:正在检查数据表
Closing table : 正在将表中数据刷新到磁盘中
Locked:被其他查询锁住了记录
Sending Data:正在处理Select查询,同时将结果发送给客户端

  • Info:一般记录线程执行的语句,默认显示前100个字符。想查看完整的使用show ful processlist;

2. 查询缓存

这是MySQL的一个可优化查询的地方,如果开启了查询缓存且在
查询缓存过程中查询到完全相同的SQL语句,则将查询结果直接返回给客户端;如果没有开启查询缓存或者没有查询到完全相同的 SQL 语句则会由解析器进行语法语义解析,并生成“解析树”。

  • 缓存Select查询的结果和SQL语句
  • 执行Select查询时,先查询缓存,判断是否存在可用的记录集,要求是否完全相同(包括参数值),这样才会匹配缓存数据命中。
  • 即使开启查询缓存,以下SQL也不能缓存

查询语句使用SQL_NO_CACHE
查询的结果大于query_cache_limit设置
查询中有一些不确定的参数,比如now()

  • show variables like ‘%query_cache%’; //查看查询缓存是否启用,空间大小,限制等
  • show status like ‘Qcache%’; //查看更详细的缓存参数,可用缓存空间,缓存块,缓存多少等

3. 解析器

将客户端发送的SQL进行语法解析,生成解析树。预处理器会根据一些MySQL的规格检测解析树是否合法,例如这里将检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义,最后生成新的解析树

4. 查询优化器

根据解析树生成最优的执行计划。MySQL使用很多优化策略生成最优的执行计划,可以分为两类:静态优化(编译时优化)、动态优化(运行时优化)。

  • 等价变换规则

5=5 and a>5 改成 a > 5
a < b and a=5 改成b>5 and a=5
基于联合索引,调整条件位置等

  • 优化count、min、max函数

InnoDB引擎min函数只需要找索引最左边
InnoDB引擎max函数只需要找索引最右边
MyISAM引擎count(*),不需要计算,直接返回

  • 提前终止查询

使用了limit查询,获取limit所需的数据,就不在继续遍历后面数据

  • in的优化

MySQL对in查询,会先进行排序,再采用二分法查找数据。比如where id in (2,1,3),变
成 in (1,2,3)

5. 查询执行引擎

查询执行引擎负责执行 SQL 语句,此时查询执行引擎会根据 SQL 语句中表的存储引擎类型,以及对应的API接口与底层存储引擎缓存或者物理文件的交互,得到查询结果并返回给客户端。若开启用查询缓存,这时会将SQL 语句和结果完整地保存到查询缓存(Cache&Buffer)中,以后若有相同的 SQL 语句执行则直接返回结果。
如果开启了查询缓存,先将查询结果做缓存操作
返回结果过多,采用增量模式返回。