文章目录
- 一、应用架构演变
- 1.1 V1.0单机单库
- 1.2 V2.0主从架构
- 1.3 V3.0分片
- 1.4 V4.0云数据库
- 二、架构体系
- 2.1 网络连接层(Client Connectors)
- 2.2 核心服务层(MySQL Server)
- 2.3 存储引擎层(Pluggable Storage Engines)
- 2.4 系统文件层(File System)
- 2.5 日志系统
- 2.5.1日志
- 2.5.2 数据
- 三、Sql执行机制
- 参考
一、应用架构演变
1.1 V1.0单机单库
瓶颈: 无法支撑大量数据,并发量也不高,如果挂了相关的所有服务全都死掉了。
1.2 V2.0主从架构
mysql相关架构有MHA、MGC、PXC
瓶颈: 相比于1.0并没有提升数据量的存储性能,因为是多主的形式每一个库数据量都是相同的,为了保证一致性写操作还扩大了。
1.3 V3.0分片
alibaba mycat、当当网 sharding
瓶颈: 复杂,要设计数据路由问题。保持数据一致性也是难题。
1.4 V4.0云数据库
使mysql编程一个saas(Software as a service)服务,服务提供配置性、扩展性、存储结构设计。
二、架构体系
2.1 网络连接层(Client Connectors)
驱动例如java、JDBC
2.2 核心服务层(MySQL Server)
- 系统管理和控制工具:负责备份集群和安全
- 连接池:管理连接提升处理效率
- SQL接口:接收sql语句
- 解析器:语法检查生成解析树
- 查询优化器:优化并制定查询过程
- 缓存:缓存
2.3 存储引擎层(Pluggable Storage Engines)
存储引擎层负责MySQL中数据的存储与提取,与底层系统文件进行交互。MySQL存储引擎是插件式的,服务器中的查询执行引擎通过接口与存储引擎进行通信,接口屏蔽了不同存储引擎之间的差异 。现在有很多种存储引擎,各有各的特点,最常见的存储引擎是MyISAM和InnoDB。
2.4 系统文件层(File System)
系统文件层负责将数据库的数据和日志存储在文件系统之上,并完成与存储引擎的交互,是文件的物理存储层。主要包含日志文件、数据文件、配置文件、pid 文件、socket 文件等。
2.5 日志系统
主要作用是存储数据库的数据和产生的日志
2.5.1日志
- 错误日志(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%’; //时长
2.5.2 数据
- db.opt 文件:记录这个库的默认使用的字符集和校验规则。
- frm 文件:存储与表相关的元数据(meta)信息,包括表结构的定义信息等,每一张表都会有一个frm 文件。
- MYD 文件:MyISAM 存储引擎专用,存放 MyISAM 表的数据(data),每一张表都会有一个 .MYD 文件。
- MYI 文件:MyISAM 存储引擎专用,存放 MyISAM 表的索引相关信息,每一张 MyISAM 表对应一个 .MYI 文件。
- ibd文件和 IBDATA 文件:存放 InnoDB 的数据文件(包括索引)。InnoDB 存储引擎有两种表空间方式:独享表空间和共享表空间。独享表空间使用 .ibd 文件来存放数据,且每一张 InnoDB 表对应一个 .ibd 文件。共享表空间使用 .ibdata 文件,所有表共同使用一个(或多个,自行配置).ibdata 文件。
- ibdata1 文件:系统表空间数据文件,存储表元数据、Undo日志等 。
- ib_logfile0、ib_logfile1 文件:Redo log 日志文件。
三、Sql执行机制
- 1.建立连接
MySQL客户端与服务器端基于通信协议建立连接,通信方式是 “ 半双工 ”。对于每一个 MySQL 的连接,时刻都有一个线程状态来标识这个连接正在做什么。 - 2.查询缓存
这是MySQL中可以优化查询的位置,如果开启了查询缓存且在查询缓存中查询到完全相同的SQL语句,则将查询结果直接返回给客户端;如果没有开启查询缓存或者没有查询到完全相同的 SQL 语句,则执行后续过程,由解析器进行语法语义解析,并生成“解析树” - 3.解析器
解析器负责将客户端发送的SQL进行语法解析,生成"解析树"。预处理器会根据MySQL规则进一步检查“解析树”是否合法,例如检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义,最后生成新的“解析树”。 - 4.查询优化器
查询优化器负责根据“解析树”生成最优的执行计划。MySQL有很多优化策略生成最优的执行计划,主要有两类:静态优化(编译时优化)、动态优化(运行时优化)。 - 5查询执行引擎
执行引擎负责执行“执行计划”,此时执行引擎会根据 SQL 语句中表的存储引擎类型,以及对应的API接口与底层存储引擎缓存或者物理文件的交互,得到查询结果并返回给客户端。若开启用查询缓存,会将SQL 语句和结果完整地保存到查询缓存中,后续若有相同的 SQL 语句,执行时则直接从缓存返回结果。