MySQL 的架构图:

主要分为以下几部分:
- 
连接层 
- 
服务层 
- 
引擎层 
- 
存储层 
存储引擎
存储引擎是存储数据、建立索引、更新/查询数据的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以被称作表类型。
查看任意一张表的建表语句:
show create table account;
结果可能类似:
CREATE TABLE `account` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(10) DEFAULT NULL COMMENT '姓名',
  `money` int DEFAULT NULL COMMENT '余额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3 COMMENT='账户表'
建表语句中的ENGINE=InnoDB表名该表使用的存储引擎是InnoDB。
可以通过以下命令查看当前数据库支持哪些存储引擎:
show engines ;
结果:

可以看到,InnoDB 是 MySQL 默认的存储引擎,且该引擎支持事务,支持保存点。
InnoDB
InnoDB 是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后是 MySQL 的默认存储引擎。
特点:
- 
DML 操作遵循 ACID 模型,支持事务。 
- 
行级锁,提高并发访问性能。 
- 
支持外键 FOREIGN KEY 约束,保证数据的完整性和正确性。 
每个使用了 InnoDB 的表都有一个对应的表空间文件(xxx.ibd),表空间文件中存放了表结构、数据和索引。
参数 innodb_file_per_table 决定是否每张表使用单独的表空间文件(或者多张表使用一个表空间文件)。
查询当前该参数的值:
show variables like 'innodb_file_per_table';

表示当前每张表使用单独的表空间文件。
表空间文件保存在 MySQL 安装目录下的 /data/数据库名目录下:

如果是安装到当前用户,也可能位于 C 盘的
用户/AppData/MySQL目录下。
MySQL 提供一个工具可以解读 ibd 文件:
ibd2sdi account.ibd
返回的信息是 JSON 格式,包含列名等:

逻辑存储结构:
- 
TableSpece:表空间 
- 
Segment:段 
- 
Extent:区 
- 
Page:页 
- 
Row:行 

MyISAM
MyISAM 是 MySQL 早期默认的存储引擎,其特点是:
- 
不支持事务,不支持外键 
- 
表锁,不支持行锁 
- 
访问速度快 
MyISAM 使用的存储文件:
- 
xxx.sdi:存储表结构信息 
- 
xxx.MYD:存储数据 
- 
xxx.MYI:存储索引 
创建一个使用 MyISAM 引擎的示例表:
create table my_myisam(
    id int,
    name varchar(10)
) engine = MyISAM comment = '使用 MyISAM 引擎的示例表';
对应的存储文件:

其中存放表结构的 sdi 文件是个文本文件,可以直接打开,其内容是 JSON 结构:

Memory
Memory 存储引擎的表数据存放在内存中,因此最好只用于临时表或缓存用途(避免意外宕机导致的数据丢失)。其特点是:
- 
内存存储,访问速度快 
- 
hash 索引(默认) 
对应的存储文件只包含 xxx.sdi(存储表结构信息)。
总结
存储引擎的区别:
| 特点 | innoDB | MyISAM | Memory | 
|---|---|---|---|
| 存储限制 | 64TB | 有 | 有 | 
| 事务安全 | 支持 | - | - | 
| 锁机制 | 行锁 | 表锁 | 表锁 | 
| B+tree 索引 | 支持 | 支持 | 支持 | 
| Hash 索引 | - | - | 支持 | 
| 全文索引 | 支持(5.6版本之后) | 支持 | - | 
| 空间使用 | 高 | 低 | N/A | 
| 内存使用 | 高 | 低 | 中等 | 
| 批量插入速度 | 低 | 高 | 高 | 
| 支持外键 | 支持 | - | - | 
存储引擎的选择依据:
- 
InnoDB,对于事务完整性和并发下数据一致性要求高的场景使用,大部分业务场景都使用该引擎。 
- 
MyISAM,对于插入和读取性能要求高,且不常修改的场景,一般用于记录日志。但目前该功能已广泛被 mongoDB 替代。 
- 
Memory,记录需要高速读写,且不需要持久化的数据,一般用于缓存。但目前该功能已广泛被 Redis 替代。 
 
                
文章评论