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

锁篇

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

相关推荐
在未来等你6 小时前
Elasticsearch面试精讲 Day 13:索引生命周期管理ILM
大数据·分布式·elasticsearch·搜索引擎·面试
程序员码歌9 小时前
明年35岁了,如何破局?说说心里话
android·前端·后端
橙*^O^*安9 小时前
Go 语言基础:变量与常量
运维·开发语言·后端·golang·kubernetes
PAK向日葵9 小时前
【C/C++】面试官:手写一个memmove,要求性能尽可能高
c语言·c++·面试
工程师小星星9 小时前
Golang语言的文件组织方式
开发语言·后端·golang
哈喽姥爷10 小时前
Spring Boot---自动配置原理和自定义Starter
java·spring boot·后端·自定义starter·自动配置原理
舒一笑12 小时前
为什么where=Version就是乐观锁了?
后端·mysql·程序员
GoGeekBaird12 小时前
关于垂类AI应用落地行业的方法论思考
后端·github·agent
小宁爱Python12 小时前
Django 基础入门:命令、结构与核心配置全解析
后端·python·django