存储引擎与索引
常见存储引擎(提要)
| 引擎 | 事务 | 锁粒度 | 典型场景 |
|---|---|---|---|
| InnoDB(默认) | 支持 ACID | 行锁 | 绝大多数 OLTP,需要事务与外键 |
| MyISAM | 不支持 | 表锁 | 只读或允许表锁的旧系统(新项目少用) |
| Memory | 不支持 | 表锁 | 临时数据、易失缓存表 |
生产环境 默认使用 InnoDB;引擎在表级 ENGINE=InnoDB 指定。
索引原理(B+ 树)
InnoDB 聚簇索引的 叶子节点存完整行数据(按主键顺序);二级索引叶子存 主键值。查询沿 B+ 树定位,复杂度约 O(log n)。
索引类型(按用途)
| 类型 | 说明 |
|---|---|
| 主键索引 | 唯一且非空,一张表一个 |
| 唯一索引 | 列值唯一;列可为 NULL 时,因 SQL 中 NULL 与 NULL 不可比,多行 NULL 通常可同时存在(与业务是否允许「未知」重复无关,需在应用层约束) |
| 普通索引 | 加速 WHERE / JOIN / ORDER BY |
| 联合索引 | 多列顺序遵循 最左前缀 |
| 覆盖索引 | 索引列已含查询所需全部字段,减少回表 |
使用建议
适合建索引: 高选择性、频繁作为条件或连接的列。
慎用: 低基数字段单独索引、过多索引拖慢写入。
联合索引列顺序: 区分度高的靠前;兼顾排序需求。
避免对索引列做 函数包裹(如 WHERE YEAR(col)=2024)导致无法走索引(可改成范围条件)。
小结
引擎选 InnoDB;索引为 权衡读写 的工具,配合 EXPLAIN 分析执行计划再迭代。
