MySQL 面试题(一):基础、范式与存储引擎

最后更新:2026-07-24
所属系列:MySQL 面试题 · 第 1 / 4 篇

这组文章不追求堆砌题目,而是按“先给结论,再解释原因,最后给排查方法”的顺序整理。第一篇覆盖基础概念、范式、存储引擎、字符集与常见数据类型。

SQL 和 MySQL 有什么区别

SQL(Structured Query Language)是操作关系型数据库的标准语言,包含:

  • DDL:CREATEALTERDROP
  • DML:INSERTUPDATEDELETE
  • DQL:SELECT
  • DCL:GRANTREVOKE
  • TCL:COMMITROLLBACKSAVEPOINT

MySQL 是实现了 SQL 标准的关系型数据库管理系统。不同数据库都支持 SQL,但函数、分页语法、事务实现和优化器行为可能不同。

三大范式解决什么问题

范式主要用于减少重复数据和更新异常,不是越高越好。

第一范式(1NF)

字段值应当原子化,不能在一个字段中保存多个需要独立查询的值。例如,不要把多个手机号保存为逗号分隔字符串;应拆成用户表和手机号表。

第二范式(2NF)

在满足 1NF 的基础上,非主属性必须完全依赖整个候选键,不能只依赖联合主键的一部分。

例如订单明细以 (order_id, product_id) 为联合主键,商品名称只依赖 product_id,应拆到商品表。

第三范式(3NF)

在满足 2NF 的基础上,非主属性不能传递依赖候选键。

例如员工表中保存 department_iddepartment_namemanager_name,后两者依赖部门而不是员工,应拆到部门表。

为什么业务系统会反范式

高频读场景中,适度冗余可以减少连接和聚合,例如订单快照保存下单时的商品名称与价格。反范式必须满足:

  • 冗余字段有清晰的数据来源;
  • 更新由同一个事务、领域事件或补偿任务维护;
  • 能够检测并修复不一致。

InnoDB 和 MyISAM 的区别

对比项 InnoDB MyISAM
事务 支持 不支持
崩溃恢复 通过 redo log 等机制恢复 能力较弱
并发控制 支持行级锁和 MVCC 主要是表级锁
外键 支持 不支持
聚簇索引 主键索引叶子节点保存整行 数据文件与索引文件分离
全文索引 支持 支持
典型用途 默认选择,适合绝大多数业务 主要用于历史系统或特殊只读场景

面试回答应强调:现代 MySQL 业务表通常优先使用 InnoDB,不应再用“读多写少就选 MyISAM”作为通用结论。

为什么 InnoDB 表最好有主键

InnoDB 使用聚簇索引组织数据:

  1. 有主键时使用主键作为聚簇索引;
  2. 没有主键时选择第一个非空唯一索引;
  3. 两者都没有时生成隐藏的行 ID。

显式主键能让数据组织、二级索引引用和复制排查更稳定。常用自增整数主键是因为写入位置相对连续,可以减少页分裂;但在分布式系统中也可以使用趋势递增的全局 ID。

CHARVARCHAR 如何选择

  • CHAR(n):定长语义,适合长度固定的数据,例如国家代码;
  • VARCHAR(n):变长语义,适合名称、地址等长度波动的数据;
  • n 表示字符数,不是字节数;
  • 索引长度、行大小和字符集会影响最终空间占用。

不要因为“CHAR 查询更快”就一律使用 CHAR,先看业务语义和数据分布。

DATETIMETIMESTAMP 有什么区别

  • DATETIME 保存日期时间值,范围更大,通常适合业务时间;
  • TIMESTAMP 按 UTC 存储并根据会话时区转换,范围较小;
  • 两者都可以定义小数秒精度,例如 DATETIME(3)

跨时区系统还应统一应用、数据库连接和日志的时区策略,避免只修改数据库字段类型。

utf8utf8mb4 有什么区别

MySQL 中历史上的 utf8 最多使用 3 字节,无法完整保存 Emoji 等四字节 Unicode 字符。新系统应使用:

CREATE DATABASE app
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_0900_ai_ci;

排序规则会影响大小写、重音和比较结果,迁移前要检查唯一索引是否会因排序规则变化产生冲突。

COUNT(*)COUNT(1)COUNT(column) 的区别

  • COUNT(*) 统计行数;
  • COUNT(1) 也统计行数,现代优化器下通常没有值得依赖的性能差异;
  • COUNT(column) 只统计该列不为 NULL 的行。

面试中直接说明语义差异即可,不要背诵“COUNT(1) 永远更快”。

NULL 为什么容易出问题

NULL 表示未知,不等于空字符串或数字 0:

-- 正确
WHERE deleted_at IS NULL

-- 错误
WHERE deleted_at = NULL

聚合、唯一索引、排序和三值逻辑都可能受 NULL 影响。是否允许 NULL 应由业务语义决定,而不是一律禁止。

面试速答

删除数据的三种方式

  • DELETE:DML,可带条件,产生逐行删除记录;
  • TRUNCATE TABLE:DDL,清空整表,通常更快并重置自增值;
  • DROP TABLE:删除表结构和数据。

大表能直接加字段吗

不能只回答“可以”。要确认 MySQL 版本、操作是否支持 Instant/Inplace、是否重建表、锁持续时间以及磁盘空间。生产环境应先执行:

EXPLAIN ALTER TABLE orders ADD COLUMN remark VARCHAR(255);

并在低峰期配合监控、超时和回滚方案执行。

如何查看当前数据库配置

SELECT VERSION();
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
SHOW VARIABLES LIKE 'transaction_isolation';
SHOW ENGINE INNODB STATUS\G

下一篇将进入索引、联合索引、回表和 EXPLAIN ANALYZE