MySQL存储引擎全面解析

目录

1.存储引擎概述

2.两大主流存储引擎解析

InnoDB引擎

事务支持

行级锁定与并发控制

关键组件与日志

表与索引结构

MyISAM引擎

非事务性设计

表级锁定

存储结构

索引特性

3.存储引擎性能对比

读取性能

写入性能

内存使用效率

4.存储引擎选型建议


1.存储引擎概述

在MySQL架构中,存储引擎负责数据的存储、检索和管理 ,处于数据库系统的底层核心位置。可以将存储引擎理解为数据库的存储处理器,不同的引擎采用不同的存储结构和算法,从而形成了各自独特的性能特性和适用场景。

存储引擎的核心作用:

  1. 定义数据的物理存储格式

  2. 实现数据读写接口

  3. 管理索引结构和查询优化

  4. 提供事务和并发控制机制

  5. 确保数据完整性和持久性


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使用环境:

  • 核心表保证事务一致性

  • 高并发需求需要行级锁支持

  • 需要外键约束保证完整性


制作不易,如果对你有帮助请**点赞,评论,收藏,**感谢大家的支持

相关推荐
数据库生产实战2 小时前
Oracle隐藏参数_fix_control和_optimizer_improve_selectivity设置方法,如何用于规避性能问题?你值得看看!
数据库·oracle
数据知道2 小时前
PostgreSQL 核心原理:大字段(大对象)是如何被压缩和存储的(TOAST存储机制)
数据库·postgresql
爱喝水的鱼丶2 小时前
SAP-ABAP:高效开发指南:全局唯一标识符ICF_CREATE_GUID函数的全面解析与实践
运维·服务器·开发语言·数据库·sap·abap·开发交流
我是一只小小鱼~2 小时前
JAVA 使用spring boot 搭建WebAPI项目
java·数据库·spring boot
胡斌附体2 小时前
oracle-xe创建
数据库·oracle
翼龙云_cloud2 小时前
亚马逊云渠道商:AWS RDS数据库如何应用?
数据库·云计算·aws
予枫的编程笔记2 小时前
【MySQL飞升篇】MySQL主从复制灵魂三问:Binlog怎么选?线程如何工作?延迟怎么解?
mysql·性能优化·binlog·主从复制·数据库运维·并行复制·延迟解决
运维行者_2 小时前
用Applications Manager监控HAProxy:保障负载均衡高效稳定
运维·开发语言·前端·数据库·tcp/ip·负载均衡·服务器监控
weixin199701080162 小时前
汽车之家item_search - 根据地区获取二手车列表接口对接全攻略:从入门到精通
数据库·汽车