目录
MySQL 目前使用得比较多的版本是 MySQL5.7 和 MySQL8.0。MySQL5.7 和 MySQL 8.0 都支持多种存储引擎,在官方文档中提及的,MySQL5.7 和 MySQL8.0 支持的存储引擎有 10 种。
而主要的存储引擎有:InnoDB,MyISAM 和 Memory。
这几种存储引擎的主要区别如下:
1. 在事务安全方面
InnoDB 支持ACID 事务,适合需要高可靠性的场景。而 MyISAM 和 Memory 不支持事务。
MySQL 的 ACID 事务是指数据库事务的四个核心特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)*和*持久性(Durability)。这些特性确保了数据库事务的可靠性和数据完整性。
ACID 的具体含义
原子性(Atomicity)
事务是一个不可分割的操作单元,要么全部成功,要么全部失败。
如果事务中的任何操作失败,整个事务会回滚到最初状态,就像什么都没发生过一样。
实现方式:通过事务日志(undo log)记录操作,失败时回滚。
一致性(Consistency)
事务执行前后,数据库必须保持一致性状态,即符合预定义的规则(如约束、触发器)。
例如,转账操作中,总金额在事务前后必须保持一致。
实现方式:通过数据库约束(如主键、外键、唯一性)和业务逻辑保证。
隔离性(Isolation)
多个并发事务之间相互隔离,一个事务的操作不会被其他事务干扰。
隔离级别(如读未提交、读已提交、可重复读、串行化)决定了事务之间的可见性。
实现方式:通过锁机制(如行锁、表锁)和多版本并发控制(MVCC)实现。
持久性(Durability)
事务一旦提交,对数据的修改就是永久性的,即使系统崩溃也不会丢失。
实现方式:通过事务日志(redo log)记录操作,确保数据可以恢复。
MySQL 中 ACID 的实现
InnoDB 存储引擎是 MySQL 中支持 ACID 事务的主要引擎。
事务日志
:
undo log:用于回滚操作,保证原子性。
redo log:用于崩溃恢复,保证持久性。
锁机制
:
行级锁、间隙锁等保证隔离性。
MVCC(多版本并发控制)
:
通过版本链实现非阻塞读操作,提高并发性能。
ACID 的实际应用
转账操作
:
原子性:扣款和加款要么同时成功,要么同时失败。
一致性:转账前后总金额不变。
隔离性:其他事务在转账完成前看不到中间状态。
持久性:转账完成后,数据永久保存。
电商订单
:
原子性:订单创建、库存扣减、支付操作要么全部成功,要么全部失败。
一致性:订单状态和库存数量符合业务规则。
隔离性:多个用户同时下单时,数据不会混乱。
持久性:订单数据永久保存,即使系统崩溃也不会丢失。
总结
ACID 是数据库事务的核心特性,确保了数据的可靠性和一致性。MySQL 的 InnoDB 存储引擎通过事务日志、锁机制和 MVCC 实现了 ACID 特性,适用于需要高可靠性和数据完整性的场景。
2. 在锁机制方面
InnoDB 支持行级锁和表级锁,而 MyISAM 和 Memory 只支持表级锁,不支持行级锁。
3. 在外键支持方面
InnoDB 支持外键,而 MyISAM 和 Memory 不支持外键。
4. 在索引方面
这三种存储引擎都支持B+Tree 索引;
InnoDB 支持聚簇索引,其他两种存储引擎不支持;
Memory 支持哈希索引,其他两种存储引擎不支持;
MyISAM 支持全文索引,InnoDB 也在 MySQL5.6 后支持全文索引,但 Memory 不支持全文索引。
5. 在数据存储方式上
如果是 InnoDB,数据以 聚簇索引的方式存储,数据按主键顺序存储;
如果是 MyISAM,数据和索引分开存储;
如果是 Memory,数据存储在内存中,不支持持久化。
因为它们有这些区别,这三种存储引擎的使用场景也不一样:
在 MySQL5.5 后,InnoDB 是 MySQL 的默认存储引擎。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么 InnoDB 存储引擎是比较合适的选择。(高并发读写、需事务的场景)
在 MySQL5.5 前,MyISAM 是 MySQL 的默认存储引擎。如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。适用于这种场景的还有 MongoDB 数据库。(读多写少、静态数据,如日志表)
Memory 则通常用于临时表及缓存。适用于这种场景的还有 Redis 数据库。