MySQL由以下几部分组成:
连接池组件
管理服务和工具组件
SQL接口组件
查询分析器组件
优化器组件
缓冲组件
插入式存储引擎
物理文件
Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务 功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在 这一层实现,比如存储过程、触发器、视图等。
而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、 Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了 默认存储引擎。
MySQL存储引擎对比
MySQL独有的插入式体系结构式区别于其他数据库的重要特征。MySQL支持多种存储引擎,每种引擎都有自己的特点,能够根据不同的应用建立不同的存储表。
InnoDB存储引擎:
支持事务
支持行锁
支持外键
支持全文索引
主要面向OLTP在线事务处理
MyISAM存储引擎:
不支持事务
支持表锁
支持全文索引
主要面向OLAP在线分析处理
Memory存储引擎
将数据库放在内存中,用于存储临时的数据表。Memory存储引擎默认使用哈希索引,而不是B+树索引。只支持表锁,并发性能差,存储变长字段时按照定长字段来。
MySQL的文件分为参数文件、日志文件、socket文件、表结构文件、存储引擎文件等待
参数文件:当MySQL启动的时候,数据库会先去读取配置文件,用来确定数据库各种文件的位置和初始化参数。
套接字文件:用于UNIX的套接字
PID文件:记录数据库进程ID
日志文件有错误日志。查询日志、慢查询日志、二进制日志
错误日志
错误日志对MySQL的启动、关闭、运行进行记录,不仅仅是错误信息,也包括正确和警告信息
慢查询日值
在MySQL启动时设置一个时间,所有超过该时间到查询语句都被记录到慢日志查询文件
查询日志
记录所有对数据库的请求,无论请求是否得到正确的响应
二进制日志
二进制日志记录所有对数据库的更改操作,而不包括查询等操作。若使用update,但是没有更改数据,也会进入到二进制日志。主要作用有:
1.恢复:通过二进制日志恢复到以前的某个时间点
2.复制:与恢复类似,从数据库复制主数据时执行二进制文件即可
3.审计:对二进制文件进行审计,判断有无注入攻击
二进制日志格式可以是:
1.STATEMENT:记录逻辑SQL语句
2.ROW:记录表的行更改情况
3.MIXED:默认采用1,特殊情况采用2
设置为ROW虽然二进制文件会大,但是为数据库的恢复和复制带来了更好的性能。
不论采取何种引擎,MySQL都有一个.frm文件,记录了表的结构定义。
上述的文件都是MySQL数据库本身的文件,相当于SERVER层,所有的存储引擎都有上述的文件。但是重做日志、表空间等是innodb独有的。
表空间文件
以.idb结尾,所有基于innodb存储引擎的表的数据都会记录到该共享表空间
重做日志文件
每个innodb存储引擎至少有1个重做日志文件组,每组至少两个文件。每个重做日志文件的大小相同,并以循环写入的方式运行(一个写满后切换到另一个)。Innodb文件不能太大,也不能太小,否则就会造成性能抖动。innodb重做日志记录了每个页到更改的物理情况
事务是访问并更新数据库的一个执行单元,可以由1个或者多个语句组成。事务中的操作要么都做修改,要么都不做修该。innodb在默认隔离级别,即可重复读的场景下,完全满足事务的ACID特性。
事务的四大特性:
原子性:原子性是指整个数据库事务是不可分割的工作单位。只有事务中所有操作都成功,事务才算成功。任何一个操作失败,已经执行成功的操作也必须撤销,回退到事务执行之前的状态。
一致性:一致性是指事务从数据库的一种状态转变为下一种一致性的状态。事务开始之前和之后,数据库的完整性约束没有被破坏。
隔离性:事务的隔离性要求事务的读写对象的操作与其他事务操作对象的操作相互隔离,在事务提交之前对其他事务不可见。
持久性:事务一旦提交,结果是永久性的,即时发生宕机也能恢复。宕机指的是数据库程序发生崩溃或故障,如果是硬件设备损坏则属于高可同性,不属于持久性范围。持久性属于高可靠性。
innodb中隔离性通过锁来实现,原子性、一致性、持久性通过undo、redo log文件来实现。undo保证事务的一致性,redo保障原子性和持久性。redo恢复页的提交操作,undo回滚到是事务的某个特定版本。redo是物理日志,记录页的物理修改操作,undo是逻辑日志。
redo:
事务提交时先将操作写入到redo,然后写入bin,最后在commit。redo由redolog和缓冲池中的重做日志缓冲组成,当重做日志缓冲中的事务没有刷到磁盘时,还会导致事务丢失。不过一般重做日志缓冲都是每秒刷新。
undo:
用来帮助事务回滚和MVCC机制。与redo不同, undo存放在数据库内部的一个特殊段中,在共享表空间内。undolog也会产生redo log, 因为undo log也需要持久性的保护。
事务分类
扁平事务:最基础的事务,不带有保存点不能提交和回滚事务的某一部分
带有保存点的扁平事务:在扁平的基础上加保存点,允许事务回滚到较早的一个状态,而不是从头开始
链事务:保存点在系统宕机后都会丢失,所以链事务相当于将一个事务拆成多个,下一个事务接受上一个事务必要的文件。相当于部分部分提交,防止保存点丢失
嵌套事务:事务一层一层嵌套
分布事务:在不同的节点中各完成事务的一部分
按照不同的类型分为:
热备:在正在运行的数据库中备份,并且对数据库的操作没有影响
冷备:在停止运行的数据库中备份
温备:在正在运行的数据库中备份,但是对数据库的操作有影响
按照备份后的文件分为:
逻辑备份:备份内容时可读的 是一条一条的SQL语句 即binlog中的statement格式。好理解,但是性能慢
裸备份:数据库中的物理文件 即ROW格式。速度快但是无法理解