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 替代。
文章评论