4、MySQL 索引与事务

一、学习目标

  • 理解索引作用、类型与创建原则
  • 掌握组合索引最左前缀原则
  • 理解事务 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 版本保留等开销。

相关推荐
二宝哥1 小时前
【问题】本地启动springboot项目启动flowable引擎会提示数据库脚本错误,同事本地启动没有报错(MySQL表明大小写敏感参数)
数据库·mysql
John_Hui1 小时前
第 5 篇:Ubuntu 安装 Redis
数据库·redis·缓存
TDengine (老段)1 小时前
TDengine IDMP 十大实用功能(2)
大数据·数据库·chrome·时序数据库·tdengine·idmp·有问有答
Navicat中国1 小时前
Navicat 连接 Redis 数据库
数据库·redis·数据库开发·navicat
东方佑2 小时前
去魅:工具调用、Agent 调用、A2A、MCP、Harness 到底都是什么
服务器·网络·数据库
瑞克-桑切斯2 小时前
2、 MySQL 主从复制与读写分离
数据库·mysql
收纳过往2 小时前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava
咖啡八杯3 小时前
Redis 工具封装:RedisCache 对 Operations 体系的二次封装
java·数据库·redis·缓存·框架·springboot·若依
PaperData3 小时前
2000-2025年地级市科技支行设立数据
数据库·科技