MySQL索引和事务笔记
文章目录
- 一、索引
- 1. 索引是什么?
- 2. 索引的优缺点
- 优点
- 缺点
- 3. 索引的操作
- 4. 索引背后的数据结构
- 5. 面试高频问题
- 二、事务
- 1. 事务的作用
- 2. 事务的实现机制
- 3. 事务的基本操作
- 4. 事务的四大特性(ACID)
- 5. 并发事务常见问题
- 6. 事务隔离级别
- 三、总结与建议
一、索引
1. 索引是什么?
- 类似于书的目录(Index),用于加速查询。
- 查询时默认全表遍历,复杂度 O(N),每行需硬盘读取,效率低。
- 索引通过特殊数据结构(如B+树)提升查询速度。
2. 索引的优缺点
优点
- 显著提升查询效率,特别是大数据量场景。
- 查询频率高于增删改的业务场景下尤为合适。
缺点
- 占用额外存储空间。
- 增删改操作时需同步维护索引,可能影响写入性能。
3. 索引的操作
-
查看索引
show index from 表名;
主键、唯一键(unique)、外键(foreign key)都会自动生成索引。 -
创建索引
create index 索引名 on 表名(列名);
注意:大表上创建索引是危险操作,可能导致大量IO,建议提前规划。 -
删除索引
drop index 索引名 on 表名;
只能删除自建索引,不能删除自动生成的主键/唯一索引。
4. 索引背后的数据结构
-
二叉搜索树
高度大、IO次数多,不适合数据库索引。 -
哈希表
只支持等值查询,不支持范围和模糊查询。 -
B+树(主流索引结构)
- N叉搜索树,树高度低,减少硬盘IO。
- 叶子节点存储所有数据,并通过链表连接,方便范围查询。
- 查询都落在叶子节点,查询开销稳定。
- 非叶子节点只存key,不存数据,空间占用小。
- 适合数据库大规模数据的高效检索。
5. 面试高频问题
- 索引是什么?解决了什么问题?
- 索引的代价(空间、写入性能)。
- 如何操作索引?注意事项?
- 索引的数据结构及B+树的优势。
二、事务
1. 事务的作用
- 保证一组SQL操作的原子性,要么全部执行,要么全部不执行(回滚)。
- 典型场景:银行转账,防止只转出未转入。
2. 事务的实现机制
- 数据库通过日志体系记录每一步操作,支持回滚和崩溃恢复。
- 不是所有操作都能回滚(如drop database)。
- 事务操作应尽量简短,避免长事务。
3. 事务的基本操作
- 开启事务:
start transaction;
- 提交事务:
commit;
- 回滚事务:
rollback;
4. 事务的四大特性(ACID)
-
原子性(Atomicity)
要么全部执行,要么全部不执行。 -
一致性(Consistency)
事务前后,数据都处于合法状态。 -
持久性(Durability)
事务提交后,数据永久保存在硬盘。 -
隔离性(Isolation)
并发事务间互不干扰,避免相互影响。
5. 并发事务常见问题
-
脏读
一个事务读取到另一个未提交事务的数据。 -
不可重复读
同一事务内多次读取,数据被其他已提交事务修改,导致结果不一致。 -
幻读
一事务多次查询,期间其他事务插入/删除了数据,导致结果集数量不同。
6. 事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 | 并发性 | 说明 |
---|---|---|---|---|---|
read uncommitted | 有 | 有 | 有 | 最高 | 可读未提交数据,最不安全 |
read committed | 无 | 有 | 有 | 较高 | 只读已提交数据 |
repeatable read | 无 | 无 | 有 | 较低 | 读写都加锁,MySQL默认级别 |
serializable | 无 | 无 | 无 | 最低 | 串行执行,最安全最慢 |
三、总结与建议
- 索引是提升查询性能的利器,但需权衡空间和写入性能。
- B+树是数据库索引的核心结构,掌握其原理有助于面试答题和实际优化。
- 事务保证数据可靠性,理解ACID和隔离级别是数据库开发的基础。
- 索引和事务都需结合实际业务场景合理使用,避免过度依赖或滥用。