面试经验之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操作来提高查询性能。

相关推荐
JaceJufrog14 小时前
VidGo Bug修复1-修复线程错误
后端
GalenZhang88814 小时前
Springboot调用Ollama本地大模式
java·spring boot·后端
好久没学习了要努力呀14 小时前
让理解窗口函数变得简单
后端
小蒜学长14 小时前
springboot海洋馆预约系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
IT_陈寒15 小时前
SpringBoot实战:这5个隐藏技巧让我开发效率提升200%,90%的人都不知道!
前端·人工智能·后端
catchadmin15 小时前
如何在 PHP 升级不踩坑?学会通过阅读 RFC 提前预知版本变化
开发语言·后端·php
风象南15 小时前
商业化必备:SpringBoot 实现许可证控制
后端
caibixyy1 天前
Spring Boot 整合 Redisson 实现分布式锁:实战指南
spring boot·分布式·后端
码事漫谈1 天前
C++编程陷阱:悬空引用检测方法与防范指南
后端
码事漫谈1 天前
缓存友好的数据结构设计:提升性能的关键技巧
后端