一、核心约束(记住区别)
| 约束类型 | 作用 | 特点 |
|---|---|---|
| 主键(PRIMARY KEY) | 唯一标识一行 | 唯一、非空、一个表只能有一个 |
| 外键(FOREIGN KEY) | 表间关联 | 引用另一表的主键,保证一致性 |
| 索引(INDEX) | 加速查询 | 可重复、可多列、可唯一 |
| CHECK 约束 | 列值条件校验 | MySQL 8.0.16+ 支持 |
✅ 口诀:主键唯一非空,外键引用主键,索引加速查询,Check 把关数据
二、索引(重点中的重点)
1. 按数据结构分
| 类型 | 特点 | 场景 |
|---|---|---|
| B+Tree | 范围查询快 | 大多数查询 |
| Hash | 等值查询极快 | 精确匹配 |
| Fulltext | 全文检索 | 文章、搜索 |
2. 按物理存储分
-
聚簇索引:数据按主键排序存储,一个表一个
-
二级索引:存储主键值,需回表
3. 按字段个数分
-
单列索引
-
联合索引:最左前缀原则(必须从左到右使用)
✅ 口诀:B+树最常见,Hash精确快,全文搜文本,聚簇主键排
三、事务(ACID 必背)
| 特性 | 含义 |
|---|---|
| 原子性 | 要么全成功,要么全失败 |
| 一致性 | 事务前后数据完整 |
| 隔离性 | 事务间互不干扰 |
| 持久性 | 提交后永久保存 |
隔离级别(从低到高)
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | ✅ | ✅ | ✅ |
| READ COMMITTED | ❌ | ✅ | ✅ |
| REPEATABLE READ(默认) | ❌ | ❌ | ✅ |
| SERIALIZABLE | ❌ | ❌ | ❌ |
✅ 口诀:读未提交全乱,读已提交防脏,可重复读防两次,串行化最安全
四、存储过程 vs 触发器
| 对比项 | 存储过程 | 触发器 |
|---|---|---|
| 调用方式 | 手动 CALL | 自动触发 |
| 触发事件 | 无 | INSERT / UPDATE / DELETE |
| 使用场景 | 复杂逻辑封装 | 自动化维护、日志、校验 |
✅ 口诀:过程手动调,触发器自动跑
五、锁(理解即可)
| 分类 | 类型 | 特点 |
|---|---|---|
| 粒度 | 表锁 | 锁整个表,并发差 |
| 粒度 | 行锁 | 锁一行,并发好(InnoDB) |
| 粒度 | 间隙锁 | 防幻读 |
| 性质 | 共享锁(读锁) | 可并发读 |
| 性质 | 排它锁(写锁) | 独占写 |
✅ 口诀:表锁慢,行锁快,间隙锁防幻读,共享读,排它写
六、存储引擎(重点对比)
| 引擎 | 事务 | 锁粒度 | 适用场景 |
|---|---|---|---|
| InnoDB(默认) | ✅ | 行锁 | 高并发、写多 |
| MyISAM | ❌ | 表锁 | 读多写少 |
| Memory | ❌ | 表锁 | 临时数据、缓存 |
✅ 口诀:InnoDB 全都要,MyISAM 只读快,Memory 重启丢
七、日志(了解即可)
| 日志类型 | 作用 |
|---|---|
| 慢日志 | 记录慢 SQL,用于优化 |
| 重做日志(Redo Log) | 保证事务持久性,崩溃恢复 |
✅ 口诀:慢日志抓慢 SQL,重做日志保数据
八、并发问题(高频面试)
| 问题 | 描述 |
|---|---|
| 更新丢失 | 后提交覆盖前提交 |
| 脏读 | 读到未提交的数据 |
| 不可重复读 | 同一事务两次读结果不同 |
| 幻读 | 新增/删除导致行数变化 |
✅ 口诀:丢覆脏未提,两次读不一,幻读行数变
九、常用命令速查
sql
-- 索引
CREATE INDEX idx_name ON table(col);
DROP INDEX idx_name ON table;
-- 事务
START TRANSACTION;
COMMIT;
ROLLBACK;
-- 存储过程
CALL proc_name();
-- 触发器(自动执行)
CREATE TRIGGER trigger_name BEFORE INSERT ON table ...
-- 查看索引
SHOW INDEX FROM table;
-- 查看引擎
SHOW ENGINES;