锁篇
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操作来提高查询性能。