这组文章不追求堆砌题目,而是按“先给结论,再解释原因,最后给排查方法”的顺序整理。第一篇覆盖基础概念、范式、存储引擎、字符集与常见数据类型。
SQL 和 MySQL 有什么区别
SQL(Structured Query Language)是操作关系型数据库的标准语言,包含:
- DDL:
CREATE、ALTER、DROP; - DML:
INSERT、UPDATE、DELETE; - DQL:
SELECT; - DCL:
GRANT、REVOKE; - TCL:
COMMIT、ROLLBACK、SAVEPOINT。
MySQL 是实现了 SQL 标准的关系型数据库管理系统。不同数据库都支持 SQL,但函数、分页语法、事务实现和优化器行为可能不同。
三大范式解决什么问题
范式主要用于减少重复数据和更新异常,不是越高越好。
第一范式(1NF)
字段值应当原子化,不能在一个字段中保存多个需要独立查询的值。例如,不要把多个手机号保存为逗号分隔字符串;应拆成用户表和手机号表。
第二范式(2NF)
在满足 1NF 的基础上,非主属性必须完全依赖整个候选键,不能只依赖联合主键的一部分。
例如订单明细以 (order_id, product_id) 为联合主键,商品名称只依赖 product_id,应拆到商品表。
第三范式(3NF)
在满足 2NF 的基础上,非主属性不能传递依赖候选键。
例如员工表中保存 department_id、department_name 和 manager_name,后两者依赖部门而不是员工,应拆到部门表。
为什么业务系统会反范式
高频读场景中,适度冗余可以减少连接和聚合,例如订单快照保存下单时的商品名称与价格。反范式必须满足:
- 冗余字段有清晰的数据来源;
- 更新由同一个事务、领域事件或补偿任务维护;
- 能够检测并修复不一致。
InnoDB 和 MyISAM 的区别
| 对比项 | InnoDB | MyISAM |
|---|---|---|
| 事务 | 支持 | 不支持 |
| 崩溃恢复 | 通过 redo log 等机制恢复 | 能力较弱 |
| 并发控制 | 支持行级锁和 MVCC | 主要是表级锁 |
| 外键 | 支持 | 不支持 |
| 聚簇索引 | 主键索引叶子节点保存整行 | 数据文件与索引文件分离 |
| 全文索引 | 支持 | 支持 |
| 典型用途 | 默认选择,适合绝大多数业务 | 主要用于历史系统或特殊只读场景 |
面试回答应强调:现代 MySQL 业务表通常优先使用 InnoDB,不应再用“读多写少就选 MyISAM”作为通用结论。
为什么 InnoDB 表最好有主键
InnoDB 使用聚簇索引组织数据:
- 有主键时使用主键作为聚簇索引;
- 没有主键时选择第一个非空唯一索引;
- 两者都没有时生成隐藏的行 ID。
显式主键能让数据组织、二级索引引用和复制排查更稳定。常用自增整数主键是因为写入位置相对连续,可以减少页分裂;但在分布式系统中也可以使用趋势递增的全局 ID。
CHAR 和 VARCHAR 如何选择
CHAR(n):定长语义,适合长度固定的数据,例如国家代码;VARCHAR(n):变长语义,适合名称、地址等长度波动的数据;n表示字符数,不是字节数;- 索引长度、行大小和字符集会影响最终空间占用。
不要因为“CHAR 查询更快”就一律使用 CHAR,先看业务语义和数据分布。
DATETIME 和 TIMESTAMP 有什么区别
DATETIME保存日期时间值,范围更大,通常适合业务时间;TIMESTAMP按 UTC 存储并根据会话时区转换,范围较小;- 两者都可以定义小数秒精度,例如
DATETIME(3)。
跨时区系统还应统一应用、数据库连接和日志的时区策略,避免只修改数据库字段类型。
utf8 和 utf8mb4 有什么区别
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。