目录
1.存储引擎概述
在MySQL架构中,存储引擎负责数据的存储、检索和管理 ,处于数据库系统的底层核心位置。可以将存储引擎理解为数据库的存储处理器,不同的引擎采用不同的存储结构和算法,从而形成了各自独特的性能特性和适用场景。
存储引擎的核心作用:
-
定义数据的物理存储格式
-
实现数据读写接口
-
管理索引结构和查询优化
-
提供事务和并发控制机制
-
确保数据完整性和持久性
2.两大主流存储引擎解析
InnoDB引擎
InnoDB 是 MySQL 最主流、最核心的存储引擎 ,自 MySQL 5.5 版本起成为默认引擎。它被设计为一个事务安全、支持高并发、具备崩溃恢复能力的存储引擎,适用于绝大多数需要可靠性和高性能的应用场景。
事务支持
-
原子性 :通过 Undo Log 实现。事务中的操作要么全部完成,要么全部回滚。
-
一致性:通过其他三大特性和约束(如外键)保证数据逻辑正确。
-
隔离性 :默认使用 可重复读 隔离级别,通过 MVCC 和 锁机制 控制并发访问。
-
持久性 :通过 Redo Log 和 Double Write Buffer 确保事务提交后数据永久保存。
行级锁定与并发控制
-
行级锁:最小粒度锁定,大幅提升多用户并发性能。
-
MVCC (多版本并发控制):
-
通过隐藏的事务ID列和回滚指针,实现非锁定读(快照读)。
-
写操作不阻塞读操作,读操作也不阻塞写操作。
-
-
Next-Key Locking:防止幻读,结合记录锁和间隙锁。
关键组件与日志
-
缓冲池:
-
内存核心区域,缓存数据和索引页,减少磁盘I/O。
-
采用 LRU 算法 管理页面。
-
-
Redo Log:
-
物理日志,记录页面的修改 。采用先写日志机制,保证崩溃恢复能力。
-
循环写入,固定大小(由innodb_log_file_size控制)。
-
-
Undo Log:
-
逻辑日志,记录事务修改前的数据版本,用于回滚和 MVCC。
-
存储在特殊的回滚段中。
-
-
Double Write Buffer:
- 防止部分写问题,确保数据页写入的完整性。脏页刷盘前,先写入此缓冲区,再顺序写入数据文件。
表与索引结构
-
聚簇索引:
-
表数据按主键顺序物理存储。主键查询极快,但主键不宜过大。
-
若无主键,InnoDB 会生成隐藏的 RowID 作为聚簇索引。
-
-
二级索引:
- 叶子节点存储主键值,而非数据行指针。回表查询可能带来额外开销。
-
数据存储:
-
表结构存储在**.frm文件** (MySQL 8.0 后纳入系统表空间),数据与索引存储在**.ibd文件**(独享表空间模式)。
-
支持表分区。
-
MyISAM引擎
MyISAM 是 MySQL 早期版本的默认存储引擎 (MySQL 5.5 之前),以其简单、高效 的特性著称,特别适合读密集型应用场景。
非事务性设计
-
不支持事务:没有 ACID 特性,崩溃后需要手动修复或可能丢失数据。
-
不支持行级锁 :只有表级锁,并发写性能较差。
-
不保证数据一致性:在系统故障时,可能处于不一致状态。
表级锁定
-
共享读锁:读取时对整个表加共享锁。
-
排他写锁:写入时对整个表加排他锁,阻塞所有其他操作。
-
并发写入时性能瓶颈明显。
存储结构
-
三文件结构:
-
.frm:表结构定义文件
-
.MYD:数据文件
-
.MYI:索引文件
-
-
数据和索引分离存储,便于单独维护。
索引特性
-
非聚簇索引 :索引和数据分开存储,索引叶子节点存储数据行的物理地址。
-
全文索引支持:是早期 MySQL 中唯一支持全文索引的引擎(5.6 前)。
-
压缩索引:支持前缀压缩,节省空间。
3.存储引擎性能对比
读取性能
在低并发简单查询下,InnoDB引擎和MyISAM引擎差距不大,由于MyISAM引擎的表结构简单,在全表扫描下占优
sql
-- 在低并发下,两者差异不大
SELECT * FROM users WHERE id = 100;
-- MyISAM 在以下场景有优势:
SELECT COUNT(*) FROM logs; -- MyISAM 存储行数,O(1)
SELECT * FROM users WHERE name LIKE '%xiao%'; -- 全表扫描
并发读取
-
MyISAM:共享读锁,多个读不互斥
-
InnoDB:MVCC 无锁读取
-
并发读时:两者性能相当
写入性能
由于MyISAM引擎最低支持表级锁,锁的粒度比InnoDB引擎的行级锁要大,所以在并发写入时,InnoDB引擎的速度要快。
MyISAM 并发写入瓶颈:
sql
-- 线程1执行(获取表级排他锁)
UPDATE table SET col=1 WHERE id=100;
-- 期间线程2被阻塞:
INSERT INTO table VALUES (...); -- 等待
DELETE FROM table WHERE id=200; -- 等待
InnoDB 优势:行级锁允许同时修改不同行
内存使用效率
InnoDB引擎因为要实现事务结构、锁信息、MVCC等机制,额外占用的内存较多
典型配置对比:
sql
# MyISAM 优化配置
key_buffer_size = 2G
# 总内存使用:~2G
# InnoDB 优化配置
innodb_buffer_pool_size = 8G
innodb_log_buffer_size = 16M
# 总内存使用:~8.5G+(用于同等数据量)
内存效率:MyISAM 更节省内存
4.存储引擎选型建议
在目前的环境下,MySQL 8.0已移除MyISAM的系统表使用,完全转向InnoDB,那是不是说明MyISAM引擎就没有用处了呢?
MyISAM使用环境:
-
读多写少,利用全文索引
-
纯静态的报表数据表
InnoDB使用环境:
-
核心表保证事务一致性
-
高并发需求需要行级锁支持
-
需要外键约束保证完整性
制作不易,如果对你有帮助请**点赞,评论,收藏,**感谢大家的支持
