面试经验之MySQL 锁与索引实战总结分享

48 阅读4分钟

锁篇

1. MySQL 中的锁类型

   - 共享锁(S锁):允许事务读取数据,但不允许修改数据。
- 排他锁(X锁):允许事务修改数据,同时会阻止其他事务读取或修改数据。
- 行级锁:锁定单行数据,支持高并发。
- 表级锁:锁定整个表,性能较低,但实现简单。
- 意向锁:指示事务打算对某行数据加行锁。
- 临时锁:例如 SELECT FOR UPDATE 锁定读的行。​编辑

2. 锁的分类,行锁的作用

   锁分为 悲观锁乐观锁。行锁是针对某行数据的锁定,允许其他事务操作其他行数据,提高并发性。

3. 间隙锁与唯一索引

   - 间隙锁(Gap Lock):锁定一个范围,不包括范围中的数据。这防止了新的数据行插入该范围内。
- 唯一索引与间隙锁:唯一索引会涉及间隙锁,尤其是在非唯一索引的情况下,保证数据一致性。

4. 乐观锁与悲观锁

   - 乐观锁:假设数据不会发生冲突,适合高并发情况下使用,通常依赖版本号或者时间戳来判断数据是否发生变化。
- 悲观锁:假设数据会发生冲突,通常使用数据库的锁机制来控制并发。
- SELECT FOR UPDATE:用于悲观锁,会锁定选定的行,直到事务完成。

5. MVCC(多版本并发控制)

   - MVCC 是一种保证事务并发性的方法,通过为每个事务保存数据的多个版本来实现。
- 实现方式:通过使用版本号或时间戳,并在查询时只看到当前事务视图的数据,从而实现并发控制。
- 算法:通常使用事务的开始时间戳和数据的时间戳来判断数据的可见性。


​编辑

索引篇

1. InnoDB 与 MyISAM 引擎的区别

   - InnoDB:支持事务、外键、行级锁;提供ACID支持,适合需要高并发和事务控制的应用。
- MyISAM:不支持事务、不支持外键,表级锁,适合读操作较多的场景。

2. InnoDB 引擎的 4 大特性

   - 事务支持:支持 ACID。
- 行级锁:提高并发性。
- 外键支持:数据完整性检查。
- 崩溃恢复:通过 redo log 和 undo log 实现数据恢复。

3. Change Buffer 的使用场景

   - Change Buffer:用于优化对非主键索引的写入,存储修改的索引信息,在适当的时机将其刷新到磁盘。
- 使用场景:在高写负载的环境下,通过延迟磁盘写入减少 I/O 操作,提高性能。

4. InnoDB 的索引实现

   - B+ 树:通过B+树实现索引,所有数据都在叶子节点,且叶子节点通过链表连接,适合范围查询。
- B+ 树的优点:适合磁盘存储,高效支持范围查询。

5. B+ 树索引的底层单元与高度

   - 底层单元:叶子节点存储数据,非叶子节点存储索引。
- 高度决定:树的高度与数据量和树的分支因子有关。高度较低时查询效率高。

6. 聚集索引与非聚集索引的区别

   - 聚集索引:数据行本身就是按照索引的顺序存储的。
- 非聚集索引:索引和数据分开存储,索引表记录了数据的物理位置。

7. 非聚集索引回表查询

   - 回表查询:当查询的数据不在索引中时,需要从数据表中获取完整的行数据,这个过程称为回表。

8. InnoDB 的索引策略

   - 默认索引:主键索引和非聚集索引。
- 联合索引:通过组合多个字段创建索引,可以加速多字段的查询。

9. 索引的创建原则

   - 选择高基数的字段:选择查询频繁的、基数大的字段建立索引。
- 避免创建过多的索引:索引会增加写操作的负担。

10. 索引失效情况

   - 索引失效原因:如使用了 ORNULL 值、函数等,可能导致索引失效。
- 联合索引失效:如只使用了联合索引的部分字段,索引可能失效。

11. UUID 作为主键的影响

   - 性能影响:UUID 不像自增主键那样顺序生成,因此会导致插入时数据分布不均,影响写入性能。

12. 自增主键顺序断裂的情况

   - 顺序断裂:自增主键的顺序会因为主键冲突或者回滚事务等原因而断裂。

13. 组合索引查询

   - 只用 b+c 查询:能够通过组合索引的前缀规则(如先按 a 再按 b)来加速查询。但没有涉及到前缀的查询可能无法利用索引。​编辑


MySQL的锁和索引是确保数据库并发性和查询效率的核心机制,锁通过控制数据的访问来保证事务的完整性和一致性,而索引通过优化数据检索和减少I/O操作来提高查询性能。