【MySQL】进阶01-存储引擎
目录
- 一,MySQL体系结构
- 二,存储引擎简洁与操作命令
- 语法格式:
- 实战示例:
- 三,InnoDB 与 MyISAM 的特点对比
一,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 到底支持哪些引擎。
SHOWENGINES;执行这个命令后,MySQL 会返回一张表,包含以下关键列:
Engine:引擎的名字(如 InnoDB, MyISAM, MEMORY)。Support:MySQL 对该引擎的支持状态:DEFAULT:当前默认使用的引擎(现代版本基本都是 InnoDB)。YES:支持并已启用。NO:不支持或未启用。Transactions:极重要!表示该引擎是否支持事务(可以看到只有 InnoDB 是YES)。XA:是否支持分布式事务。Savepoints:是否支持事务回滚点(方便局部回滚)。
存储引擎是基于表的。也就是说,在同一个数据库里,你可以让张三表用 InnoDB,李四表用 MyISAM。
CREATETABLE表名(字段名1数据类型[约束],字段名2数据类型[约束])ENGINE=引擎名称;-- 创建一个用于核心业务、需要事务支持的订单表(指定为 InnoDB)CREATETABLEt_order(order_idINTPRIMARYKEYAUTO_INCREMENT,user_idINTNOTNULL,moneyDECIMAL(10,2))ENGINE=InnoDB;-- 创建一个仅用于记录日志、不需要事务的日志表(指定为 MyISAM)CREATETABLEt_log(log_idINTPRIMARYKEYAUTO_INCREMENT,contentVARCHAR(500),create_timeDATETIME)ENGINE=MyISAM;注意:如果你在建表时不写
ENGINE = ...,MySQL 会自动使用默认引擎(即上面SHOW ENGINES;查出来的DEFAULT引擎),MySQL里就是InnoDB。
如果线上的表以前用的是 MyISAM,现在想改成 InnoDB,不需要删表重打,一条命令搞定。
语法格式:
ALTERTABLE表名ENGINE=新引擎名称;实战示例:
-- 将日志表的引擎从 MyISAM 修改为 InnoDBALTERTABLEt_logENGINE=InnoDB;底层原理(避坑指南):> 当你执行这条命令时,MySQL 会在后台做三件事:
- 创建一张新表(使用你指定的新引擎)。
- 把旧表的数据全部复制到新表中。
- 复制完成后,删除旧表,重命名新表。
代价:如果这张表的数据量非常大(比如几千万条),这个操作会消耗大量的 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,不用改。
