1. MySQL 体系结构
如下图:
MySQL是由SQL接口,解析器,优化器,缓存,存储引擎组成的(SQL Interface、 Parser、 Optimizer、Caches&Buffers、Pluggable Storage Engines)
Connectors指的是不同语言中与SQL的交互
Management Serveices & Utilities: 系统管理和控制工具,例如备份恢复、Mysql复制、集群等
Connection Pool: 连接池:管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要
SQL Interface: SQL接口:接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
Parser: 解析器, SQL命令传递到解析器的时候会被解析器验证和解析。主要功能:
a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
Optimizer: 查询优化器, SQL语句在查询之前会使用查询优化器对查询进行优化
Cache和Buffer(高速缓存区): 查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。
这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存, key缓存,权限缓存等
Engine :存储引擎。存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。
MySQL相关底层文件
2. MySQL 文件构成MySQL整个数据库的是所有的相关文件,这些文件有:
参数文件my.cnf:告诉MySQL实例在启动的时候去哪里找数据库文件,并指定初始化文件参数,包括定义内存缓冲池大小等等
日志文件:用来记录MySQL实例对某些条件作出响应时写入的文件,包括错误日志文件,二进制日志文件,慢查询日志文件,查询日志文件等
Socket文件:当用Unix套接字方式连接时使用的文件
Pid文件:MySQL实例的进程ID文件
MySQL表结构文件:用来存放表结构定义的文件
存储引擎相关文件:每个存储引擎都有自己相关的文件来保存各种数据,包括表数据和索引数据等等
参数文件:当MySQL实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定的初始化参数
2.1 MySQL 参数文件数据库参数其实是一个键值对(key/value),比如innodb_buffer_pool_size=1G。
可以通过show variables命令来查看所有的参数,也可以通过like关键词来过滤特定的
参数,还可以通过performance_schema.global_variables视图(5.7.6版本以后)来查看参数
show variables like '%innodb_buffer_pool%'
select * from performance_schema.global_variables where
variable_name='innodb_buffer_pool_size';
MySQL数据库中的参数可以分为动态参数和静态参数两种
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html #官方文档, 对一些参数的详细解释
2.1.1 动态参数参数的详细解释
动态参数是指在数据库运行的过程中可以动态修改的参数,可以通过set命令对动态参数进行修改
用法:
mysql> help set
Name: 'SET'
Description:
Syntax:
SET variable_assignment [, variable_assignment] ...
variable_assignment:
user_var_name = expr
| param_name = expr
| local_var_name = expr
| [GLOBAL | SESSION]
system_var_name = expr
| [@@global. | @@session. | @@]
system_var_name = expr
Global和session是指该参数的修改是基于当前会话还是基于整个实例的生命周期
设置为global参数修改,并不影响my.cnf中的变化,当数据库下次重启依然是参数文件中的配置
注: 如果不重启mysql 的情况下动态修改参数,先看看该参数是不是动态参数, 如果是动态参数 则可以用set global 方式修改 , 修改完动态参数文文件,再加入到my.cnf
例如autocommit 是dynamic 动态参数