介绍
大约 4 分钟
介绍
- 流行的开源关系型数据库
逻辑架构
- MySQL的逻辑架构可以分为三层:连接层、服务层和引擎层
连接层
- 处理与客户端的请求连接
- 客户端连接的建立与处理:长连接,减少了线程切换的开销。
- 安全认证
- 连接资源管理:连接数管理
- 线程管理:线程池的目的是复用连接线程
服务层
服务层是MySQL中的核心组件,负责提供各种数据库操作所需的基本功能,
SQL语法处理
事务管理
缓存管理
事务管理
事务
事务
- 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个 sql 语句,这些语句要么都执行,要么都不执行。
ACID
- 衡量事务的四个特性
- 原子性(Atomicity):事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
- 一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
- 当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。
- 如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
- 隔离性(Isolation):一个事务的执行不能其它事务干扰。
- 事务隔离级别
- 不同事务的隔离级别,实际上是一致性与并发性的一个权衡与折衷。
- 并发问题
- 脏读
- 不可重复读
- 幻读
- 持续性(Durability):也称永久性
- 指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。
- 接下来的其他操作或故障不应该对其有任何影响。
事务的隔离级别
Mysql事务
使用事务
典型的 MySQL 事务是如下操作的:
start transaction;
…… #一条或多条sql语句
commit;
- 其中 start transaction 标识事务开始,commit 提交事务,将执行结果写入到数据库。
- 如果 sql 语句执行出现问题,会调用 rollback,回滚所有已经执行成功的 sql 语句。当然,也可以在事务中直接使用 rollback 语句进行回滚。
- 自动提交
- MySQL 中默认采用的是自动提交(autocommit)模式
- 在自动提交模式下,如果没有 start transaction 显式地开始一个事务,那么每个 sql 语句都会被当做一个事务执行提交操作。
- 通过set autocommit=0;,可以关闭 autocommit;需要注意的是,autocommit 参数是针对连接的,在一个连接中修改了参数,不会对其他连接产生影响。
- 如果关闭了 autocommit,则所有的 sql 语句都在一个事务中,直到执行了 commit 或 rollback,该事务结束,同时开始了另外一个事务。
- InnoDB
- 存储:存放在磁盘中
- 但如果每次读写数据都需要磁盘 IO,效率会很低。
- 提供了缓存(Buffer Pool),Buffer Pool 中包含了磁盘中部分数据页的映射,作为访问数据库的缓冲
- 数据修改时,除了修改 Buffer Pool 中的数据,还会在 redo log 记录这次操作;
- redo log:MySQL 宕机,重启时可以读取 redo log 中的数据,对数据库进行恢复。
- 默认的隔离级别:可重复读RR,
- 在 SQL 标准中,RR 是无法避免幻读问题的,但是 InnoDB 实现的 RR 避免了幻读问题。
- 事务回滚
- undo log,
- 当事务对数据库进行修改时,InnoDB 会生成对应的 undo log。
- 如果事务执行失败或调用了 rollback,导致事务需要回滚,便可以利用 undo log 中的信息将数据回滚到修改之前的样子。
- 存储:存放在磁盘中
引擎层
- 引擎层负责存储数据和执行SQL语句。MySQL支持多种存储引擎。
- InnoDB
- 默认的事务型存储引擎
- 提供了事务支持、行级锁定、外键约束等功能,主要用于高并发、高可靠性的OLTP场景。
- MyISAM
- MyISAM通常用于只读数据表,适用于简单查询和全文索引。
- 不支持事务、行级锁等功能,适用于OLAP场景。
- 只能对整张表加锁
- 。。。
- InnoDB
InnoDB
存储结构
- InnoDB的底层结构主要由两部分组成:内存结构和磁盘结构。
内存结构
- 缓冲池(Buffer Pool)
- 更改缓冲区(Change Buffer)
- 自适应哈希索引(Adaptive Hash Index)
- 日志缓冲区( Log Buffer)
磁盘结构
- 表空间(Tablespace)
- 数据字典(Data Dictionary)
- 双写缓冲区(Doublewrite Buffer)
- 重做日志(Redo Log)
- 更改缓冲区(Change Buffer)