MySQL 的存储引擎是数据库底层用于管理数据存储、索引、事务、锁机制等核心功能的组件,不同存储引擎有不同的特性,适用于不同的业务场景。MySQL 支持多种存储引擎(可通过 SHOW ENGINES; 查看),其中最常用的是 InnoDB、MyISAM,此外还有 Memory、CSV、Archive 等特殊场景引擎。
一、InnoDB(MySQL 5.5+ 默认存储引擎)
1.核心特性
1.1.支持事务
完全支持事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)
通过 redo log(重做日志)保证事务持久性,undo log(回滚日志)支持事务回滚。
1.2.行级锁和并发控制
支持行级锁(仅锁定修改的行,而非整个表),大幅提升多用户并发写入性能。
结合 MVCC(多版本并发控制) 机制,实现 “读不加锁、写不阻塞读”,优化读写并发。
1.3.外键约束(Foreign Key)
支持外键关联,保证数据的参照完整性(如 ON DELETE CASCADE 级联删除)。
1.4.聚簇索引
数据物理存储按主键顺序排列(聚簇索引即主键索引),查询主键时效率极高;二级索引(非主键索引)存储主键值,需回表查询完整数据。
1.4.崩溃恢复
依赖 redo log 实现崩溃后的数据恢复,确保意外宕机后数据不丢失。
1.5.支持全文索引(5.6+)和空间索引
可对文本字段建立全文索引(FULLTEXT),支持复杂的文本搜索;支持地理空间数据索引。
2.使用场景
需事务支持的业务(如电商订单、金融交易、用户账户)。
高并发读写场景(如秒杀系统、高频交易)。
需保证数据完整性(外键、约束)的场景。
3.存储文件
表结构:table_name.frm(MySQL 8.0 后合并到 ibd 文件)。
数据和索引:table_name.ibd(独立表空间,可通过 innodb_file_per_table 配置)。
二、MyISAM(MySQL 5.5 前默认存储引擎)
MyISAM 是 MySQL 早期的默认存储引擎,专注于读性能优化,但功能简单,不支持事务和行级锁,目前已逐渐被 InnoDB 替代。
1.核心特性
1.1.不支持事务和外键
设计简单,无事务开销,读操作性能优异,但无法保证数据一致性(如崩溃后可能丢失数据)。
1.2.表级锁
对表的读写操作加表级锁(读锁共享,写锁排他),写入时会阻塞所有读操作,并发写入性能差。
1.3.支持全文索引和压缩表
原生支持全文索引(比 InnoDB 更早),适合静态数据的检索。
可通过 myisampack 工具压缩表,减少磁盘占用(压缩后只读)。
1.4.非聚簇索引
数据文件(.MYD)和索引文件(.MYI)分离,索引仅存储数据行指针,查询需通过指针定位数据。
1.5.计数器优化
内置计数器(如 COUNT(*) 无需全表扫描,直接返回预存值),适合频繁统计行数的场景。
2.使用场景
只读或读多写少的场景(如博客、新闻网站的文章表)。
无需事务的静态数据(如历史日志、归档数据)。
需频繁执行 COUNT(*) 统计的表。
3.存储文件
表结构:table_name.frm。
数据:table_name.MYD(MyData)。
索引:table_name.MYI(MyIndex)。
三、Memory(临时内存引擎)
1.核心特性
1.1.内存存储
数据存储在内存中,读写速度远高于磁盘引擎(适合缓存临时结果)。
1.2.支持哈希索引和 B+ 树索引
默认使用哈希索引(查询单条记录极快,但不支持范围查询);也可指定 B+ 树索引(支持范围查询)
1.3.表级锁
并发性能差,写入时阻塞所有读操作。
1.4.不支持 TEXT、BLOB 类型
仅支持固定长度数据类型(如 CHAR 而非 VARCHAR),节省内存。
1.5.数据易失性
服务重启或崩溃后,数据全部丢失(仅元数据保留)。
2.适用场景
临时数据缓存(如会话数据、临时计算结果)。
高频访问的小表(如字典表、配置表)。
需快速查询的场景(如验证码存储、临时统计)。
3.存储文件
表结构:table_name.frm(磁盘上)。
数据:内存中(无磁盘文件)。

4382

被折叠的 条评论
为什么被折叠?



