【MySQL】进阶01-存储引擎

目录


一,MySQL体系结构

在开始之前,我们必须要了解MySQL的体系结构,知道它大概是怎么运作的。

MySQL 的架构设计非常优秀,它采用了插件式的存储引擎架构,将"查询处理"与"数据存储/提取"完全解耦。通常,MySQL 体系结构自上而下可以分为四层(连接层、服务层、引擎层、存储层)。

层级名称 核心职责(它是干嘛的) 包含的核心组件 / 技术 举个通俗的例子
1. 连接层 (Connection) 安全看门人 。 负责客户端的连接、权限验证、线程分配。 连接池 (Connection Pool)、用户鉴权系统、SSL 安全连接。 就像去银行办事,门口的保安核验你的身份证,并给你取一个排队号。
2. 服务层 (Service) 核心大脑 。 负责 SQL 语句的解析、优化、执行以及所有跨引擎的功能。 SQL 接口、解析器 (Parser)、优化器 (Optimizer) 银行的业务经理。他负责看懂你的申请表(解析),想出最快办完的方案(优化),然后指挥柜员。
3. 引擎层 (Engine) 干活的工人 (可插拔)。 负责具体数据的存储和提取,决定了表的特性。 InnoDB 引擎、MyISAM 引擎、Memory 引擎等。 柜台里的具体办事员。有的办事员擅长办大额贷款(InnoDB,稳重安全),有的擅长快速数钞票(MyISAM,速度快)。
4. 存储层 (Storage) 保险库 。 负责把数据真正持久化到磁盘上。 操作系统文件系统、裸设备、.ibd 文件、日志文件。 银行后面的物理大金库,钱(数据)最终锁在里面的铁皮柜里。

在这一部分,面试和实战中最喜欢考的就是"服务层"与"引擎层"的分工。

只要记住一句话:"服务层负责想,引擎层负责做。"

  • 比如你写一句:SELECT * FROM user WHERE id = 1;
  • 服务层 的优化器会思考:我要不要用 id 这个索引?用它需要花多少成本?
  • 想好之后,服务层对引擎层 下达命令:"去把 id = 1 的这行数据给我拿过来。"
  • 引擎层(比如 InnoDB)就会去磁盘或内存里把这行数据找出来,恭恭敬敬地递给服务层。

二,存储引擎简洁与操作命令

MySQL 的灵魂就在于它的插件式存储引擎。这意味着,MySQL 规定了一套统一的接口(标准),任何人都可以根据这套接口开发自己的存储引擎。

在开发或排查问题时,你首先需要知道你的 MySQL 到底支持哪些引擎。

sql 复制代码
SHOW ENGINES;

执行这个命令后,MySQL 会返回一张表,包含以下关键列:

  • Engine:引擎的名字(如 InnoDB, MyISAM, MEMORY)。

  • Support:MySQL 对该引擎的支持状态:

  • DEFAULT当前默认使用的引擎(现代版本基本都是 InnoDB)。

  • YES:支持并已启用。

  • NO:不支持或未启用。

  • Transactions极重要! 表示该引擎是否支持事务 (可以看到只有 InnoDB 是 YES)。

  • XA:是否支持分布式事务。

  • Savepoints:是否支持事务回滚点(方便局部回滚)。

存储引擎是基于表的。也就是说,在同一个数据库里,你可以让张三表用 InnoDB,李四表用 MyISAM。

sql 复制代码
CREATE TABLE 表名 (
    字段名1 数据类型 [约束],
    字段名2 数据类型 [约束]
) ENGINE = 引擎名称;
sql 复制代码
-- 创建一个用于核心业务、需要事务支持的订单表(指定为 InnoDB)
CREATE TABLE t_order (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    money DECIMAL(10,2)
) ENGINE = InnoDB;

-- 创建一个仅用于记录日志、不需要事务的日志表(指定为 MyISAM)
CREATE TABLE t_log (
    log_id INT PRIMARY KEY AUTO_INCREMENT,
    content VARCHAR(500),
    create_time DATETIME
) ENGINE = MyISAM;

注意: 如果你在建表时不写 ENGINE = ...,MySQL 会自动使用默认引擎(即上面 SHOW ENGINES; 查出来的 DEFAULT 引擎),MySQL里就是InnoDB。

如果线上的表以前用的是 MyISAM,现在想改成 InnoDB,不需要删表重打,一条命令搞定。

语法格式:

sql 复制代码
ALTER TABLE 表名 ENGINE = 新引擎名称;

实战示例:

sql 复制代码
-- 将日志表的引擎从 MyISAM 修改为 InnoDB
ALTER TABLE t_log ENGINE = InnoDB;

底层原理(避坑指南): > 当你执行这条命令时,MySQL 会在后台做三件事:

  1. 创建一张新表(使用你指定的新引擎)。
  2. 把旧表的数据全部复制到新表中。
  3. 复制完成后,删除旧表,重命名新表。
    代价: 如果这张表的数据量非常大(比如几千万条),这个操作会消耗大量的 IO 性能并锁表,绝对不能在白天业务高峰期执行!

三,InnoDB 与 MyISAM 的特点对比

对比维度 InnoDB 存储引擎 MyISAM 存储引擎 为什么重要(大白话解释)
事务安全 支持 (ACID) 不支持 InnoDB 断电能自动恢复数据;MyISAM 断电数据可能损坏或丢失。
锁的粒度 行级锁 (Row Lock) 表级锁 (Table Lock) InnoDB 几百人同时改不同行互不影响;MyISAM 一人改数据,整张表锁死,别人只能排队。
外键约束 支持 不支持 InnoDB 能在数据库层面保证表与表之间的数据联动和一致性。
磁盘文件 1个核心文件.ibd (数据与索引合一) 2个核心文件.MYD (存数据) .MYI (存索引) InnoDB 索引和数据在一起,查到索引就能直接拿到数据,效率极高。
崩溃恢复 支持 (通过 redo log) 不支持 InnoDB 具备金融级的安全保障 (Crash-Safe);MyISAM 崩溃后需要人工修复表。
底层索引 聚簇索引 非聚簇索引 决定了数据在磁盘上的物理排列方式。

所以一般默认就是InnoDB,不用改。

相关推荐
TDengine (老段)4 小时前
TDengine 连接算子 — Inner/Outer/ASOF/Window Join 的实现与使用
大数据·数据库·物联网·哈希算法·时序数据库·tdengine·涛思数据
Keano Reurink4 小时前
搜索API与GSC数据对比:发现数据盲区
数据库·python·数据挖掘
shushangyun_4 小时前
汽车服务行业B2B平台+AI解决方案哪家专业:2026年最新测评
java·运维·网络·数据库·人工智能·汽车
大黄说说4 小时前
深入理解 Go 协程 Goroutine:并发编程的核心精髓
java·数据库·python
sulikey4 小时前
数据库系统概论4 - 更新与视图 期末速成课笔记
数据库·笔记·考试·期末速成·数据库系统概论
锋行天下4 小时前
数据库安全并发控制详解:乐观锁 vs 悲观锁 vs 原子操作
前端·数据库·后端
2601_961875245 小时前
花生十三公考课程|网课|视频
数据库·windows·git·svn·eclipse·github
l1t5 小时前
DeepSeek总结的parquet Variant “碎形化“技术
数据库·parquet
云计算磊哥@5 小时前
运维开发宝典030-MySQL06数据库运维阶段总结
运维·数据库·运维开发
这个DBA有点耶5 小时前
国产数据库有哪些?2026年主流产品选型对比
数据库·程序人生·职场和发展·架构·程序员创富·改行学it