《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》

MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎

  • [MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎](#MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎)
  • [一、MySQL 的整体体系架构是什么?](#一、MySQL 的整体体系架构是什么?)
  • [二、MySQL Server 层包含哪些核心组件?](#二、MySQL Server 层包含哪些核心组件?)
  • [三、Connectors 是什么?](#三、Connectors 是什么?)
  • [四、MySQL 连接管理负责什么?](#四、MySQL 连接管理负责什么?)
  • [五、如何查看 MySQL 当前连接?](#五、如何查看 MySQL 当前连接?)
  • [六、MySQL 长连接和短连接有什么区别?](#六、MySQL 长连接和短连接有什么区别?)
    • [1. 短连接](#1. 短连接)
    • [2. 长连接](#2. 长连接)
  • [七、MySQL 空闲连接多久会断开?](#七、MySQL 空闲连接多久会断开?)
  • [八、mysql_reset_connection() 有什么作用?](#八、mysql_reset_connection() 有什么作用?)
  • [九、Management Service & Utilities 是什么?](#九、Management Service & Utilities 是什么?)
  • [十、SQL Interface 是什么?](#十、SQL Interface 是什么?)
  • [十一、Parser 是什么?](#十一、Parser 是什么?)
    • [为什么 SQL 写错会提示 syntax error?](#为什么 SQL 写错会提示 syntax error?)
  • [十二、Optimizer 是什么?](#十二、Optimizer 是什么?)
    • [Optimizer 会决定哪些事情?](#Optimizer 会决定哪些事情?)
  • [十三、一条 SELECT SQL 在 MySQL 中大致如何执行?](#十三、一条 SELECT SQL 在 MySQL 中大致如何执行?)
  • [十四、MySQL Query Cache 是什么?](#十四、MySQL Query Cache 是什么?)
  • [十五、为什么 MySQL 8.0 删除了 Query Cache?](#十五、为什么 MySQL 8.0 删除了 Query Cache?)
  • [十六、什么是 MySQL 存储引擎?](#十六、什么是 MySQL 存储引擎?)
  • [十七、如何查看 MySQL 支持哪些存储引擎?](#十七、如何查看 MySQL 支持哪些存储引擎?)
  • [十八、MyISAM 存储引擎是什么?](#十八、MyISAM 存储引擎是什么?)
  • [十九、MyISAM 为什么不适合事务业务?](#十九、MyISAM 为什么不适合事务业务?)
  • [二十、MyISAM 的锁有什么特点?](#二十、MyISAM 的锁有什么特点?)
  • [二十一、MyISAM 有哪些主要特点?](#二十一、MyISAM 有哪些主要特点?)
  • [二十二、MyISAM 适合什么场景?](#二十二、MyISAM 适合什么场景?)
  • [二十三、MySQL 默认存储引擎是什么?](#二十三、MySQL 默认存储引擎是什么?)
  • [二十四、MEMORY 存储引擎是什么?](#二十四、MEMORY 存储引擎是什么?)
  • [二十五、MEMORY 表在 MySQL 重启后会怎样?](#二十五、MEMORY 表在 MySQL 重启后会怎样?)
  • [二十六、MEMORY 适合什么场景?](#二十六、MEMORY 适合什么场景?)
  • [二十七、InnoDB 存储引擎是什么?](#二十七、InnoDB 存储引擎是什么?)
  • [二十八、InnoDB 为什么适合事务系统?](#二十八、InnoDB 为什么适合事务系统?)
  • [二十九、InnoDB 的锁有什么特点?](#二十九、InnoDB 的锁有什么特点?)
  • [三十、InnoDB 是否支持外键?](#三十、InnoDB 是否支持外键?)
  • [三十一、InnoDB 如何处理不可重复读和幻读问题?](#三十一、InnoDB 如何处理不可重复读和幻读问题?)
  • [三十二、InnoDB、MyISAM、MEMORY 有什么区别?](#三十二、InnoDB、MyISAM、MEMORY 有什么区别?)
  • [三十三、为什么 MySQL 要设计可插拔存储引擎?](#三十三、为什么 MySQL 要设计可插拔存储引擎?)
  • [三十四、Server 层和 InnoDB 有什么区别?](#三十四、Server 层和 InnoDB 有什么区别?)
  • [三十五、为什么理解 MySQL 架构有助于 SQL 优化?](#三十五、为什么理解 MySQL 架构有助于 SQL 优化?)
  • 三十六、常见误区
    • [1. MySQL 就是 InnoDB 吗?](#1. MySQL 就是 InnoDB 吗?)
    • [2. MySQL 8.0 还有 Query Cache 吗?](#2. MySQL 8.0 还有 Query Cache 吗?)
    • [3. MyISAM 查询快,所以应该优先使用吗?](#3. MyISAM 查询快,所以应该优先使用吗?)
    • [4. MEMORY 表重启后整张表都会消失吗?](#4. MEMORY 表重启后整张表都会消失吗?)
    • [5. 数据库长连接一定比短连接好吗?](#5. 数据库长连接一定比短连接好吗?)
  • [三十七、FAQ:MySQL 体系架构常见问题](#三十七、FAQ:MySQL 体系架构常见问题)
    • [MySQL 体系架构主要分为哪两部分?](#MySQL 体系架构主要分为哪两部分?)
    • [MySQL Parser 是做什么的?](#MySQL Parser 是做什么的?)
    • [MySQL Optimizer 是做什么的?](#MySQL Optimizer 是做什么的?)
    • [MySQL 8.0 为什么删除 Query Cache?](#MySQL 8.0 为什么删除 Query Cache?)
    • [MySQL 默认存储引擎是什么?](#MySQL 默认存储引擎是什么?)
    • [InnoDB 和 MyISAM 最大区别是什么?](#InnoDB 和 MyISAM 最大区别是什么?)
    • [InnoDB 和 MEMORY 最大区别是什么?](#InnoDB 和 MEMORY 最大区别是什么?)
    • [如何查看 MySQL 当前连接?](#如何查看 MySQL 当前连接?)
    • 如何查看表使用什么存储引擎?
    • [如何查看 MySQL 支持哪些存储引擎?](#如何查看 MySQL 支持哪些存储引擎?)
  • [三十八、30 秒记住 MySQL 体系架构](#三十八、30 秒记住 MySQL 体系架构)
  • 三十九、总结

MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎

前言

很多开发者学习 MySQL 时,最先接触的是:

sql 复制代码
SELECT
INSERT
UPDATE
DELETE

但一条 SQL 从客户端发送到 MySQL 后,并不是直接去磁盘读取数据。

MySQL 内部需要经历连接管理、SQL 解析、查询优化、执行计划选择、存储引擎访问等多个过程。

从整体设计上看,MySQL 服务端可以理解为两大核心部分:

Server 层负责连接管理、SQL 解析、查询优化和执行协调;存储引擎层负责数据和索引的实际存储与读取。

可以先建立这样一个整体认识:

理解这套架构,是继续学习 MySQL 索引、事务、锁、MVCC、SQL 优化和 InnoDB 原理的重要基础。


一、MySQL 的整体体系架构是什么?

MySQL 的服务端体系可以从逻辑上划分为:

text 复制代码
MySQL
├── Server 层
└── 存储引擎层

其中 Server 层主要负责:

  • 客户端连接;
  • 身份认证;
  • SQL 接收;
  • SQL 解析;
  • SQL 优化;
  • 执行协调;
  • 数据库管理功能。

存储引擎层主要负责:

  • 数据存储;
  • 数据读取;
  • 索引组织;
  • 事务实现;
  • 锁机制;
  • 数据持久化。

两者最核心的职责区别可以概括为:

Server 层决定 SQL 应该怎么执行,存储引擎负责真正访问数据。


二、MySQL Server 层包含哪些核心组件?

MySQL Server 层可以进一步理解为多个功能模块:

除此之外,还包括数据库管理、安全、备份恢复等相关服务。

常见核心组件包括:

组件 核心作用
Connectors 客户端与 MySQL 建立通信
Connection Management 管理连接、认证、线程等
Management Service & Utilities 数据库管理、备份、恢复、安全等
SQL Interface 接收 SQL 请求
Parser 解析 SQL 语法和语义
Optimizer 生成和选择执行计划
Executor 根据执行计划执行 SQL
Storage Engine 实际读写数据和索引

三、Connectors 是什么?

Connectors 可以理解为:

客户端程序连接 MySQL 的通信接口。

不同编程语言通常通过对应的驱动程序访问 MySQL。

例如:

text 复制代码
Java
  ↓
JDBC Driver
  ↓
MySQL

Python 应用可能通过:

text 复制代码
Python
  ↓
MySQL Connector / Driver
  ↓
MySQL

PHP、C/C++、.NET 等语言也有对应的客户端驱动。

因此,Connector 的主要作用是:

让不同语言编写的应用程序能够按照 MySQL 通信协议与数据库进行交互。


四、MySQL 连接管理负责什么?

客户端访问 MySQL 时,首先需要建立数据库连接。

整个过程可以简化为:

text 复制代码
客户端发起连接
      ↓
MySQL 接收连接
      ↓
身份认证
      ↓
建立会话
      ↓
接收 SQL
      ↓
执行 SQL

建立连接并不是完全没有成本。

连接过程通常涉及:

  • TCP 连接;
  • 用户认证;
  • 权限检查;
  • 会话初始化;
  • 线程或执行资源分配。

因此,高并发应用通常不会每执行一条 SQL 就重新创建连接。


五、如何查看 MySQL 当前连接?

可以执行:

sql 复制代码
SHOW PROCESSLIST;

返回信息通常包括:

text 复制代码
Id
User
Host
db
Command
Time
State
Info

例如:

其中:

text 复制代码
Sleep

通常表示连接当前仍然存在,但暂时没有执行 SQL。


六、MySQL 长连接和短连接有什么区别?

数据库连接通常可以从使用方式上理解为:

text 复制代码
短连接
长连接

1. 短连接

短连接的过程通常是:

text 复制代码
建立连接
   ↓
执行 SQL
   ↓
关闭连接

下一次执行 SQL 时:

text 复制代码
重新建立连接
   ↓
重新认证
   ↓
再次执行

这种方式的问题是:

频繁建立和释放数据库连接会产生额外开销。


2. 长连接

长连接则是:

text 复制代码
建立连接
   ↓
执行 SQL
   ↓
保持连接
   ↓
继续执行 SQL

优点是可以减少频繁创建连接的成本。

但是如果大量连接长时间不释放,也会占用:

  • 内存;
  • 线程资源;
  • Session 状态;
  • 连接数。

因此,现代应用更常见的方案是:

使用数据库连接池复用连接,而不是频繁创建连接。

Java 项目中常见的连接池包括:

text 复制代码
HikariCP
Druid
DBCP

需要注意:

应用程序中的数据库连接池,与 MySQL Server 内部的连接管理机制并不是同一个概念。


七、MySQL 空闲连接多久会断开?

MySQL 可以通过超时参数控制空闲连接的生命周期。

常见参数包括:

text 复制代码
wait_timeout
interactive_timeout

常见默认值可能为:

text 复制代码
28800 秒

也就是:

text 复制代码
8 小时

但 8 小时并不是固定规则。

实际连接超时时间取决于:

  • MySQL 配置;
  • 客户端连接类型;
  • 服务端参数;
  • 数据库运维策略。

因此线上排查:

text 复制代码
Lost connection to MySQL server

这类连接问题时,也需要检查连接空闲时间和相关超时参数。


八、mysql_reset_connection() 有什么作用?

MySQL 客户端 API 提供了:

text 复制代码
mysql_reset_connection()

其核心作用可以理解为:

在保留底层连接的情况下,重新初始化当前 MySQL Session 的状态。

完全重新连接通常是:

text 复制代码
断开连接
   ↓
重新 TCP 建连
   ↓
重新认证
   ↓
创建新 Session

而 Reset Connection 更接近:

text 复制代码
保留连接
   ↓
清理 Session 状态
   ↓
恢复为较干净的连接状态

这种能力对于连接复用场景具有一定意义。


九、Management Service & Utilities 是什么?

Management Service & Utilities 主要负责 MySQL 的管理和维护能力。

常见功能包括:

text 复制代码
Backup
Recovery
Security
Replication
Administration
Configuration
Migration
Metadata

对应的实际工作包括:

  • 数据备份;
  • 数据恢复;
  • 用户和安全管理;
  • 主从复制;
  • 配置管理;
  • 数据迁移;
  • 元数据管理。

因此,这部分关注的是:

MySQL 数据库系统如何被管理和维护。


十、SQL Interface 是什么?

SQL Interface 是 MySQL 接收 SQL 请求的重要入口。

例如客户端执行:

sql 复制代码
SELECT * FROM user;

INSERT INTO user(id, name)
VALUES (1, 'Tom');

UPDATE user
SET name = 'Jack'
WHERE id = 1;

DELETE FROM user
WHERE id = 1;

这些 SQL 都需要进入 Server 层继续处理。

可以简单理解为:

text 复制代码
客户端
  ↓
SQL Interface
  ↓
Parser

SQL Interface 的核心作用是:

接收 SQL 请求,并将执行结果返回客户端。


十一、Parser 是什么?

Parser 是 MySQL 的 SQL 解析器。

它需要解决一个基本问题:

客户端发送的 SQL 到底表达了什么?

例如:

sql 复制代码
SELECT name
FROM user
WHERE id = 10;

解析器需要识别:

text 复制代码
SELECT
name
user
id
10

并分析:

  • SQL 类型;
  • 查询对象;
  • 查询字段;
  • 查询条件;
  • SQL 语法是否合法。

为什么 SQL 写错会提示 syntax error?

例如 SQL 存在语法问题时,MySQL 可能返回:

text 复制代码
You have an error in your SQL syntax

这类问题主要发生在 SQL 解析阶段。

因此可以记住:

Parser 负责理解 SQL,并检查 SQL 是否符合语法规则。


十二、Optimizer 是什么?

SQL 解析成功以后,MySQL 还不能直接执行。

数据库还需要决定:

这条 SQL 应该用什么方式执行成本最低?

这就是 Optimizer,也就是查询优化器的工作。


Optimizer 会决定哪些事情?

假设执行:

sql 复制代码
SELECT *
FROM user
WHERE age = 20;

如果存在多个索引,优化器需要判断:

text 复制代码
使用哪个索引?

如果存在多表 JOIN:

sql 复制代码
SELECT ...
FROM A
JOIN B ON ...
JOIN C ON ...;

优化器还可能需要决定:

text 复制代码
先访问 A?
先访问 B?
先访问 C?

不同执行方案得到的数据结果可能相同,但执行成本可能有很大差异。

因此:

Optimizer 的核心作用是在多个可选执行方案中,选择成本相对更低的执行计划。

这也是为什么 MySQL 性能优化中经常会使用:

sql 复制代码
EXPLAIN

查看执行计划。


十三、一条 SELECT SQL 在 MySQL 中大致如何执行?

假设执行:

sql 复制代码
SELECT name
FROM user
WHERE id = 10;

可以将执行过程简化为:

text 复制代码
客户端
   ↓
建立连接
   ↓
SQL Interface
   ↓
Parser
   ↓
Optimizer
   ↓
Executor
   ↓
Storage Engine
   ↓
读取数据
   ↓
返回结果

进一步理解:

Parser

主要负责:

text 复制代码
SQL 写得对不对?
SQL 查询什么?

Optimizer

主要负责:

text 复制代码
SQL 怎么执行更合适?
使用什么索引?
选择什么执行计划?

Storage Engine

主要负责:

text 复制代码
真正的数据在哪里?
索引页在哪里?
如何读取记录?

十四、MySQL Query Cache 是什么?

早期 MySQL 曾经提供 Query Cache,也就是查询缓存。

基本思路是:

第一次执行:

sql 复制代码
SELECT * FROM user WHERE id = 1;

如果查询结果可以缓存,则后续相同查询可能直接从缓存返回。

理想流程类似:

text 复制代码
SQL 查询
   ↓
命中 Query Cache
   ↓
直接返回结果

从表面看,可以减少:

  • SQL 执行;
  • 数据访问;
  • 查询延迟。

但 Query Cache 存在明显的扩展性问题。


十五、为什么 MySQL 8.0 删除了 Query Cache?

Query Cache 最大的问题之一是:

表数据发生变化后,与该表相关的缓存需要失效。

假设大量查询结果依赖:

text 复制代码
user

表。

此时执行:

sql 复制代码
UPDATE user
SET name = 'Tom'
WHERE id = 1;

与该表相关的查询缓存可能需要被清理或失效。

对于:

text 复制代码
大量读取
极少修改

的静态数据,Query Cache 曾经存在一定价值。

但是对于现代业务中常见的:

text 复制代码
INSERT
UPDATE
DELETE

频繁发生的系统,缓存维护本身可能产生较高成本。

因此:

  • MySQL 5.7 已经废弃 Query Cache;
  • MySQL 8.0 正式删除 Query Cache。

所以在现代 MySQL 架构中:

Query Cache 更应该作为历史机制理解,而不是 MySQL 8.0 的现行核心组件。


十六、什么是 MySQL 存储引擎?

当 Server 层完成 SQL 解析和执行计划选择后,真正负责数据读写的是:

text 复制代码
Storage Engine

即存储引擎。

存储引擎主要解决:

text 复制代码
数据怎么保存?
索引怎么组织?
数据怎么读取?
事务怎么实现?
锁怎么实现?

MySQL 一个非常典型的设计特点是:

存储引擎采用可插拔架构。

常见存储引擎包括:

text 复制代码
InnoDB
MyISAM
MEMORY
ARCHIVE

其中现代 MySQL 最重要的存储引擎是:

text 复制代码
InnoDB

十七、如何查看 MySQL 支持哪些存储引擎?

可以执行:

sql 复制代码
SHOW ENGINES;

如果需要查看某张表具体使用了什么存储引擎,可以执行:

sql 复制代码
SHOW CREATE TABLE user;

例如:

sql 复制代码
CREATE TABLE `user` (
    `id` BIGINT NOT NULL
) ENGINE=InnoDB;

其中:

text 复制代码
ENGINE=InnoDB

就表示该表使用 InnoDB。


十八、MyISAM 存储引擎是什么?

MyISAM 是 MySQL 历史上比较重要的存储引擎。

它的主要特点可以概括为:

text 复制代码
不支持事务
+
以表级锁为主
+
适合历史上的读取型场景

十九、MyISAM 为什么不适合事务业务?

例如:

sql 复制代码
CREATE TABLE test2 (
    tid INT,
    tname VARCHAR(20),
    money INT
) ENGINE=MyISAM;

如果业务需要:

text 复制代码
事务提交
事务回滚
强一致性

MyISAM 就并不合适。

因为 MyISAM 不支持完整的事务语义。

因此下面这些核心业务一般不应该优先选择 MyISAM:

text 复制代码
支付
转账
订单
库存
账户余额

这些业务通常需要 InnoDB 提供事务保障。


二十、MyISAM 的锁有什么特点?

MyISAM 主要采用:

text 复制代码
表级锁

也就是一次锁定整张表。

例如:

text 复制代码
事务 A 正在修改某张表
         ↓
事务 B 访问同一张表
         ↓
更容易产生锁等待

这种锁粒度在高并发读写场景中存在明显限制。

相比之下,InnoDB 支持更细粒度的行锁机制,因此通常更适合高并发 OLTP 系统。


二十一、MyISAM 有哪些主要特点?

可以总结为:

  • 不支持事务;
  • 主要使用表级锁;
  • 不支持外键约束;
  • 支持全文索引;
  • 适合某些读多写少的历史场景;
  • 高并发写入能力相对有限。

需要注意:

现代 InnoDB 同样支持全文索引,因此全文检索已经不能简单视为 MyISAM 独有优势。


二十二、MyISAM 适合什么场景?

MyISAM 更接近以下场景:

text 复制代码
不依赖事务
+
读取操作较多
+
数据修改较少
+
并发写要求不高

但对于现代通用业务系统:

通常优先考虑 InnoDB,而不是 MyISAM。


二十三、MySQL 默认存储引擎是什么?

现代 MySQL 默认使用:

text 复制代码
InnoDB

历史上 MySQL 曾长期使用 MyISAM 作为默认存储引擎。

从 MySQL 5.5 开始,默认存储引擎切换为 InnoDB。

因此可以记成:

text 复制代码
早期 MySQL
   ↓
MyISAM

MySQL 5.5+
   ↓
InnoDB

二十四、MEMORY 存储引擎是什么?

MEMORY 存储引擎最大的特点是:

数据存储在内存中。

例如:

sql 复制代码
CREATE TABLE test3 (
    tid INT,
    tname VARCHAR(20),
    money INT
) ENGINE=MEMORY;

插入数据:

sql 复制代码
INSERT INTO test3
VALUES (1, 'Tom', 1000);

查询:

sql 复制代码
SELECT *
FROM test3;

可以正常得到数据。


二十五、MEMORY 表在 MySQL 重启后会怎样?

如果 MySQL 服务重新启动:

bash 复制代码
systemctl restart mysqld

再次查询:

sql 复制代码
SELECT *
FROM test3;

之前写入的数据会丢失。

需要特别区分:

text 复制代码
表结构
vs
表数据

MEMORY 表在 MySQL 重启后:

text 复制代码
表结构
→ 仍然存在

数据
→ 丢失

因此最简单的记忆方式是:

MEMORY 表的定义还在,但数据不能依赖数据库重启后的持久化。


二十六、MEMORY 适合什么场景?

MEMORY 更适合:

text 复制代码
临时数据
可重新生成数据
高速访问数据
允许重启后丢失的数据

不适合:

text 复制代码
订单
支付记录
账户余额
库存核心数据
用户核心资料

因为这些数据都需要可靠持久化。


二十七、InnoDB 存储引擎是什么?

InnoDB 是现代 MySQL 最重要的存储引擎。

可以先记住一句:

对于绝大多数常规业务系统,如果没有特殊需求,优先使用 InnoDB。

InnoDB 主要提供:

  • 事务;
  • 行级锁;
  • 外键;
  • 崩溃恢复;
  • 高并发访问;
  • MVCC;
  • 持久化能力。

二十八、InnoDB 为什么适合事务系统?

InnoDB 支持数据库事务。

例如:

sql 复制代码
START TRANSACTION;

UPDATE account
SET balance = balance - 100
WHERE id = 1;

UPDATE account
SET balance = balance + 100
WHERE id = 2;

COMMIT;

如果操作过程中发生异常,可以结合:

sql 复制代码
ROLLBACK;

回滚事务。

因此,在:

text 复制代码
转账
支付
订单
库存
金融业务

等场景中,InnoDB 通常是更合适的选择。


二十九、InnoDB 的锁有什么特点?

InnoDB 支持:

text 复制代码
行级锁

相比 MyISAM 的表级锁,行级锁能够降低不同记录之间的锁冲突。

例如:

text 复制代码
事务 A
更新 id = 1

事务 B
更新 id = 100

如果两个事务访问的是不同记录,在满足条件时,可以拥有更好的并发能力。

因此:

InnoDB 的行级锁是其适合高并发 OLTP 系统的重要原因之一。


三十、InnoDB 是否支持外键?

支持。

例如:

sql 复制代码
CREATE TABLE orders (
    id BIGINT PRIMARY KEY,
    user_id BIGINT,
    CONSTRAINT fk_orders_user
        FOREIGN KEY (user_id)
        REFERENCES users(id)
);

外键可以帮助数据库维护:

text 复制代码
引用完整性

不过在互联网业务中,是否真正使用数据库外键,还需要结合系统架构和业务设计判断。


三十一、InnoDB 如何处理不可重复读和幻读问题?

InnoDB 默认常见隔离级别为:

text 复制代码
REPEATABLE READ

在并发控制过程中,InnoDB 会综合使用:

text 复制代码
MVCC
Record Lock
Gap Lock
Next-Key Lock

等机制。

需要注意:

不应该简单理解为"Gap Lock 单独解决所有幻读问题"。

更准确地说:

InnoDB 通过 MVCC 与多种锁机制共同实现事务隔离和并发控制,在不同读写场景下使用的机制并不完全相同。


三十二、InnoDB、MyISAM、MEMORY 有什么区别?

对比项 InnoDB MyISAM MEMORY
当前使用情况 主流 较少 特殊场景
默认引擎
事务 支持 不支持 非事务型
主要锁粒度 行级锁 表级锁 与实现相关
外键 支持 不支持 不支持
数据持久化 支持 支持 重启后数据丢失
并发能力 较高 相对较低 取决于场景
典型用途 通用业务系统 历史型读场景 临时、可重建数据

可以快速记忆为:

text 复制代码
InnoDB
→ 事务 + 行锁 + 持久化
→ 当前默认首选

MyISAM
→ 无事务 + 表锁
→ 现代业务较少使用

MEMORY
→ 内存存储
→ 重启数据丢失

三十三、为什么 MySQL 要设计可插拔存储引擎?

MySQL 的一个重要设计思想是:

把 SQL 通用处理逻辑和数据具体存储方式分离。

可以理解为:

Server 层不需要关心:

text 复制代码
InnoDB 数据页具体怎么组织?
MyISAM 文件怎么保存?
MEMORY 数据具体如何存放?

它只需要通过统一接口调用存储引擎。

这种设计带来的好处是:

SQL 层与底层数据存储逻辑解耦。


三十四、Server 层和 InnoDB 有什么区别?

这是非常容易混淆的问题。

假设执行:

sql 复制代码
SELECT *
FROM user
WHERE id = 100;

Server 层主要关注:

text 复制代码
SQL 是否合法?
选择什么索引?
生成什么执行计划?
如何执行 JOIN?
如何返回结果?

InnoDB 主要关注:

text 复制代码
索引页在哪里?
数据页在哪里?
如何读取记录?
如何加锁?
如何实现事务?

因此可以记住:

Server 层主要负责 SQL 逻辑处理,InnoDB 主要负责数据存储、索引、事务和锁。


三十五、为什么理解 MySQL 架构有助于 SQL 优化?

后续使用:

sql 复制代码
EXPLAIN

进行 SQL 优化时,经常会遇到:

text 复制代码
索引选择
访问类型
扫描行数
JOIN 顺序
排序方式

这些问题很多与:

text 复制代码
Optimizer

有关。

而学习:

text 复制代码
聚簇索引
B+Tree
MVCC
Redo Log
Undo Log
行锁
Gap Lock

时,又主要是在研究:

text 复制代码
InnoDB

所以必须区分:

text 复制代码
Server 层问题

和:

text 复制代码
存储引擎问题

否则很容易把不同层次的概念混在一起。


三十六、常见误区

1. MySQL 就是 InnoDB 吗?

不是。

关系更准确地表示为:

text 复制代码
MySQL
├── Server 层
└── Storage Engine
      ├── InnoDB
      ├── MyISAM
      ├── MEMORY
      └── ...

InnoDB 只是 MySQL 支持的存储引擎之一,只不过它现在是默认和主流选择。


2. MySQL 8.0 还有 Query Cache 吗?

没有。

Query Cache 已经从 MySQL 8.0 中删除。

因此看到:

text 复制代码
query_cache_size
query_cache_type

等配置时,需要先确认资料对应的 MySQL 版本。


3. MyISAM 查询快,所以应该优先使用吗?

不能这样判断。

数据库引擎选择还需要考虑:

text 复制代码
事务
并发
数据可靠性
锁竞争
崩溃恢复
业务一致性

现代通用业务一般优先使用 InnoDB。


4. MEMORY 表重启后整张表都会消失吗?

不是。

更准确地说:

text 复制代码
表结构保留
数据丢失

5. 数据库长连接一定比短连接好吗?

不是。

短连接存在频繁建连成本,而大量长期连接也会消耗资源。

生产环境通常采用:

连接池 + 最大连接数控制 + 空闲连接回收。


三十七、FAQ:MySQL 体系架构常见问题

MySQL 体系架构主要分为哪两部分?

MySQL 服务端可以从逻辑上分为:

Server 层和存储引擎层。

Server 层负责连接、SQL 解析、查询优化和执行协调;存储引擎层负责数据和索引的实际存取。


MySQL Parser 是做什么的?

MySQL Parser 是 SQL 解析器。

它负责解析 SQL 的语法和结构,并识别 SQL 操作的表、字段、条件等信息。


MySQL Optimizer 是做什么的?

MySQL Optimizer 是查询优化器。

它负责评估不同执行方案的成本,并决定索引选择、表访问顺序等执行计划。


MySQL 8.0 为什么删除 Query Cache?

因为 Query Cache 在频繁写入场景下容易产生大量缓存失效和维护成本,可扩展性有限。

因此 MySQL 5.7 已经废弃 Query Cache,MySQL 8.0 正式删除。


MySQL 默认存储引擎是什么?

现代 MySQL 默认存储引擎是:

text 复制代码
InnoDB

InnoDB 和 MyISAM 最大区别是什么?

核心区别是:

InnoDB 支持事务、行级锁和外键,更适合高并发核心业务;MyISAM 不支持事务并主要使用表级锁。


InnoDB 和 MEMORY 最大区别是什么?

InnoDB 支持持久化和事务。

MEMORY 主要将数据存储在内存中,MySQL 重启以后表数据会丢失。


如何查看 MySQL 当前连接?

执行:

sql 复制代码
SHOW PROCESSLIST;

即可查看当前连接和线程状态。


如何查看表使用什么存储引擎?

可以执行:

sql 复制代码
SHOW CREATE TABLE 表名;

查看:

text 复制代码
ENGINE=...

如何查看 MySQL 支持哪些存储引擎?

执行:

sql 复制代码
SHOW ENGINES;

即可查看当前 MySQL 实例支持的存储引擎。


三十八、30 秒记住 MySQL 体系架构

text 复制代码
MySQL 可以理解为:
Server 层 + 存储引擎层。

Server 层:
负责连接、SQL 解析、查询优化和执行协调。

Parser:
负责解析 SQL 和检查语法。

Optimizer:
负责选择索引和执行计划。

Query Cache:
MySQL 8.0 已删除。

Storage Engine:
负责数据和索引的实际读写。

InnoDB:
支持事务、行锁、外键,是当前默认引擎。

MyISAM:
不支持事务,主要使用表级锁。

MEMORY:
数据保存在内存中,MySQL 重启后数据丢失。

三十九、总结

MySQL 的核心架构可以压缩成:

text 复制代码
客户端
  ↓
连接管理
  ↓
SQL Interface
  ↓
Parser
  ↓
Optimizer
  ↓
Executor
  ↓
Storage Engine
  ↓
数据和索引

其中:

Server 层负责理解 SQL、优化 SQL 并协调执行;存储引擎负责真正的数据存储与读取。

存储引擎中:

text 复制代码
InnoDB
→ 支持事务、行级锁、外键
→ 当前默认和主流选择

MyISAM
→ 不支持事务、主要使用表级锁
→ 现代通用业务使用较少

MEMORY
→ 数据保存在内存
→ MySQL 重启后数据丢失
→ 适合临时和可重建数据

理解 Server 层和存储引擎层的职责边界以后,再学习 MySQL 索引、EXPLAIN、事务、MVCC、锁、Redo Log、Undo Log 和 SQL 性能优化,就会更加容易建立完整的知识体系。


若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/164187977

相关推荐
怕浪猫17 分钟前
FDE 最大的浪费不是写出有 bug 的代码,而是漂亮地解决了一个错误的问题
面试·架构·github
ZGIAI2 小时前
ZGI 迭代节点:批量资料的逐项处理
人工智能·架构
ZGIAI2 小时前
ZGI 知识检索:让业务回答有据可查
人工智能·架构
愤怒的苹果ext3 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
天远Date Lab3 小时前
零信任架构实战:基于天远双人婚姻评估查询构建自动化房产按揭联合审查网关
运维·人工智能·架构·自动化
2601_962219014 小时前
版本平滑升级架构:万象生鲜系统 V4.3.3 迭代无停机更新技术拆解
微服务·云原生·架构
超兔一体云6 小时前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql
2601_962218476 小时前
万象生鲜系统冷链物联网接入技术实现生鲜企业温控管理数字化
大数据·运维·微服务·云原生·架构
jianqiang.xue6 小时前
智能体整体架构设计:四大模块与目录组织
单片机·嵌入式硬件·物联网·架构·esp32