一、学习目标
- 理解索引作用、类型与创建原则
- 掌握组合索引最左前缀原则
- 理解事务 ACID、控制语句与自动提交
- 能回答常见索引优化和事务面试题
二、数据库索引基础
2.1 索引是什么
- 类似图书目录:帮助快速定位数据
- 本质:按索引列组织的查找结构,保存键值及行定位信息
- 主要目标:减少扫描与 I/O,提高查询效率
2.2 索引的优缺点
- 优点:加快查询、排序及连接;唯一索引可约束重复值
- 缺点:占用额外空间;INSERT/UPDATE/DELETE 需维护索引
- 权衡:读多写少场景通常更容易体现收益
2.3 索引选择原则
- 优先考虑 WHERE、JOIN、ORDER BY/GROUP BY 中常用列
- 选择性较高的列通常更有价值;低基数列需结合查询评估
- 考虑字段长度、数据量、写入频率与实际执行计划
- 不要用固定行数阈值判断是否建索引
三、索引类型与 SQL
3.1 普通索引 INDEX
- 不限制列值重复
- CREATE INDEX idx_name ON 表名(列名);
- ALTER TABLE 表名 ADD INDEX idx_name(列名);
3.2 唯一索引 UNIQUE
- 约束索引列值唯一;NULL 规则与列定义及 MySQL 语义有关
- CREATE UNIQUE INDEX uk_name ON 表名(列名);
- 适用:手机号、邮箱等需要唯一约束的字段
3.3 主键 PRIMARY KEY
- 每表最多一个主键约束;主键列不可为 NULL 且值唯一
- InnoDB 会为主键建立聚簇索引;没有显式主键时会选择合适的替代键
- PRIMARY KEY(id);或 ALTER TABLE 表名 ADD PRIMARY KEY(id);
3.4 组合索引 / 复合索引
- 示例:CREATE INDEX idx_a_b ON t(a,b);
- 最左前缀:通常可利用 (a,b) 的 a、(a,b),仅 b 通常不能按该索引定位
- 字段顺序要结合等值条件、范围条件、排序及查询频率设计
- 查询优化器会综合成本选择计划,不可仅凭 SELECT 字段顺序判断是否走索引
3.5 全文索引 FULLTEXT
- 用于文本关键词检索,常见 MATCH(列) AGAINST(关键词)
- 适用范围与分词、语言及引擎能力有关;不要把它等同于任意模糊匹配
3.6 查看与删除索引
- 查看:SHOW INDEX FROM 表名; 或 SHOW KEYS FROM 表名;
- 删除普通/唯一索引:DROP INDEX 索引名 ON 表名;
- 删除主键:ALTER TABLE 表名 DROP PRIMARY KEY;
四、索引使用与优化
4.1 适合考虑建索引
- 高频查询条件、关联字段、选择性较高的列
- 经常用于排序/分组的列(需结合查询计划)
4.2 谨慎建索引
- 低选择性列不一定无用,应结合组合条件与执行计划
- 更新频繁或超长字段会增加维护和存储成本
- 避免重复索引、冗余索引和为每个字段盲目建索引
4.3 常见检查方法
- EXPLAIN SELECT ...:查看访问类型、候选/实际索引、估算行数等
- 关注是否全表扫描、扫描行数、回表、排序与过滤成本
- 索引不保证一定被采用:优化器会根据成本选择执行计划
五、事务基础
5.1 事务是什么
- 把一组数据库操作作为一个逻辑工作单元
- 典型场景:转账、下单、扣库存;避免只完成部分操作
5.2 ACID 四大特性
- A Atomicity原子性:事务中的操作要么全部成功,要么全部回滚
- C Consistency一致性:事务前后满足业务规则与完整性约束
- I Isolation隔离性:并发事务之间按隔离级别控制相互影响
- D Durabilith持久性:提交成功后,已提交结果在故障恢复后应保持
- 常见实现关联:Undo Log 支持回滚/一致性读;Redo Log 支持崩溃恢复
5.3 事务控制语句
- START TRANSACTION / BEGIN:开启事务
- COMMIT:提交事务
- ROLLBACK:回滚未提交的事务
- SAVEPOINT s1:创建保存点;ROLLBACK TO s1:回滚到保存点
5.4 自动提交
- autocommit 通常默认开启:单条独立语句成功后自动提交
- SET autocommit = 0; 关闭当前会话的自动提交
- SET autocommit = 1; 开启自动提交;查看:SHOW VARIABLES LIKE 'autocommit';
- 显式事务中仍应明确 COMMIT 或 ROLLBACK;DDL 等语句可能导致隐式提交
5.5 事务实验流程
- 提交:START TRANSACTION → UPDATE → 查询核对 → COMMIT
- 回滚:START TRANSACTION → UPDATE → ROLLBACK → 核对原值
- 保存点:SAVEPOINT s1 → 修改 → ROLLBACK TO s1
六、问答
6.1 索引为什么能提高查询速度?
通过有序/组织化的索引结构减少需要检查的数据与 I/O。
6.2 索引越多越好吗?
不是;占空间并增加写入维护成本,应依据查询与执行计划取舍。
6.3 主键、唯一索引、普通索引的区别?
主键:唯一且非空,每表一个;唯一索引约束唯一;普通索引不约束唯一。
6.4 什么是最左前缀原则?
联合索引从最左列开始匹配,可使用连续的左侧前缀;跳过首列通常无法按该索引有效定位。
6.5 事务 ACID 分别是什么?
原子性、一致性、隔离性、持久性。
6.6 COMMIT 与 ROLLBACK 的区别?
COMMIT 确认提交;ROLLBACK 撤销当前事务中尚未提交的更改。
6.7 为什么事务不能开太久?
可能长期持有锁、阻塞其他事务,并增加 undo 版本保留等开销。