锁篇
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. 索引失效情况
- 索引失效原因:如使用了 OR
、NULL
值、函数等,可能导致索引失效。
- 联合索引失效:如只使用了联合索引的部分字段,索引可能失效。
11. UUID 作为主键的影响
- 性能影响:UUID 不像自增主键那样顺序生成,因此会导致插入时数据分布不均,影响写入性能。
12. 自增主键顺序断裂的情况
- 顺序断裂:自增主键的顺序会因为主键冲突或者回滚事务等原因而断裂。
13. 组合索引查询
- 只用 b+c
查询:能够通过组合索引的前缀规则(如先按 a
再按 b
)来加速查询。但没有涉及到前缀的查询可能无法利用索引。编辑
MySQL的锁和索引是确保数据库并发性和查询效率的核心机制,锁通过控制数据的访问来保证事务的完整性和一致性,而索引通过优化数据检索和减少I/O操作来提高查询性能。