【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,不用改。

相关推荐
六月雨滴9 小时前
归档日志备份
数据库·oracle·dba
白露与泡影9 小时前
自己用 ai 写了个链接 mysql 数据库的 mcp 工具
数据库·人工智能·mysql
我是一颗柠檬9 小时前
【MySQL全面教学】MySQL聚合函数与分组Day5(2026年)
数据库·后端·mysql·database
牛马鸡niumasi9 小时前
Mysql:事务管理(中)
数据库·mysql
字节高级特工9 小时前
Redis事务:简单但实用的打包执行
数据库·redis·后端·缓存
GISer_Jing9 小时前
后端系统稳定性基石:数据库设计、接口幂等性与边界case处理全链路实战
数据库·oracle·架构
无忧.芙桃9 小时前
MySQL安装与基础操作指南
数据库
还是鼠鼠10 小时前
AI掘金头条新闻系统 (Toutiao News)-用户注册-生成Token
后端·python·mysql·fastapi·web
ZFSS17 小时前
Localization Translate API 集成与使用指南
java·服务器·数据库·人工智能·mysql·ai编程