一、数据库的存储引擎分为以下四种
1、MyISAM
2、InnoDB
3、MOMERY
4、ARCHIVE
二、下面我们简单说明这几个存储引擎的特点
1、MyISAM
不支持事务、支持全文索引,但是对于一些在线分析处理操作速度快。
文件组成由myd存放数据的。myi存放索引的。
2、InnoDB
支持事务,主要是面向在线事务处理方面的应用,特点是行锁设计,并支持外键。InnoDB采用聚集索引的方式。没有主键,没有唯一键,为每一行生产一个6字节的行id作为主键。
3、MOMERY
将数据放在内存中,如果数据库重启或者宕机,表数据就会丢失。非常适合存储一些临时表,默认的是哈希索引,不是B+树索引,varchar()默认 是按照char()存储的,浪费内存。不支持text和BLOB类型。如果数据中有text和BLOB类型,数据库会把这些数字转换到磁盘上。
4、ARCHIVE
只支持INSERT和SELECT操作,使用压缩算法将数据进行压缩后存储,压缩比列一般是1:10,主要提供插入和压缩功能。
三、各个引擎的各功能对比
功能 | MYISAM | MEMORY | INNODB | ARCHIVE |
---|---|---|---|---|
存储限制 | 256TB | RAM | 64TB | None |
支持事务 | no | no | yes | no |
支持全文索引 | yes | no | no | no |
支持数索引 | yes | yes | yes | no |
支持哈希索引 | no | yes | no | no |
支持数据缓存 | no | N/A | yes | no |
支持外键 | no | no | yes | no |
四、事务
(一)事务的概念
事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。
(二)事务的特性:
A C I D
- A(原子性):一个事务的执行被视为一个不可分割的最小单元。事务里面的操作,要么全部成功执行,要么全部失败回滚,不可以只执行其中的一部分。
- C(一致性):事务的运行并不改变数据库中数据的一致性 AID是数据库的特征,通过AID手段保证C这个目的
- I(隔离性):两个以上的事务不会出现交错执行的状态(因为会导致数据不一致)
- D(持久性):事务提交之后,需要将提交的事务持久化到磁盘。即使系统崩溃,提交的数据也不应该丢失。
(三)如何保证事务的原子性
两个日志系统保证原子性和持久性
日志系统:redo logc 重做日志 和 undo logc 未做日志,两个合起来就可保证原子性
redo logc 重做日志记录了事务将要执行的每一个操作保存了事务执行过程中的每一个状态点
日志先行—》一旦开启先刷新到磁盘上,事务将要执行的操作永久的保存下来
(四)事务不隔离会产生什么问题(并发事务带来的问题)
- 脏读:事务获取到其他事务执行过程中的结果
- 丢失修改: 事务A 、B都读取同一个数据。事务A 、B先后修改数据,则 第一次修改操作丢失。
- 不可重复读:事务执行过程中读取了其他事务不同阶段的结果(修改操作导致的)
- 幻读:事务执行过程中获取到其他事务不同的阶段的结果(插入或删除的结果导致的)
(五)事务的隔离级别
- 未提交读 : 会出现脏读、不可重复读、幻读的问题
- 已提交读 : 会出现不可重复读和幻读的问题
- 可重复读 : 会出现幻读的情况(MySQL 默认且通过其他机制 间隙锁解决幻读问题)
- 可序列化 : 串行处理,效率差 上表锁,读写相互阻塞。效率低下 无并发问题