MySQL整理
MySQL是面试的重点,但是自己之前并没有太深入了解,网上的面经框架结构都不太一样,不利于梳理。
事务
事务隔离级别
隔离实现机制 MVCC(多版本并发控制)
索引
日志
binlog
redolog
undolog
具体的面试问题整理
- InnoDB 跟 MyISAM的区别
- 是否支持行级锁
- 是否支持事务
- 是否支持外键
- 是否支持数据库异常崩溃后的安全恢复
- 是否支持MVCC
- 说一下事务的ACID四大特性,MySQL通过什么来实现ACID?
- 深入介绍一下MySQL的MVCC
- 深入介绍一下MySQL的索引机制
- MySQL选择B+树的原因?B+树能有更多的叉的原因有哪些?有哪些因素限制的分叉的数目?
- 大表怎么进行优化,大表查询如果加redis怎么加,redis内存不够的问题,设置短过期时间会不会有OOM的问题
- MySQL中,int(10) 和 varchar(10) 有什么区别, 10 分别代表什么?
- 怎样建索引,顺序字段和随机字段怎么选择
- MySQL中事务是怎么实现的
- InnoDB的数据结构为什么选择B+树,比B树和B-树的优点在哪里?
- MySQL的隔离级别及其实现
- undo log 和 redo log 的底层实现?
- InnoDB 存储引擎的锁的算法
- 分库分表中项目中是怎样应用的?为什么使用分库分表?
- 锁
从整体上来说,分为悲观锁跟乐观锁
。大部分的存储引擎都是乐观锁,包括InnoDB的MVCC。
- 悲观锁
正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
在悲观锁的情况下,为了保证事务的隔离性,就需要一致性锁定读。读取数据时给加锁,其它事务无法修改这些数据。修改删除数据时也要加锁,其它事务无法读取这些数据。 - 乐观锁
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。
而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
要说明的是,MVCC的实现没有固定的规范,每个数据库都会有不同的实现方式,这里讨论的是InnoDB的MVCC。
InnoDB 存储引擎的锁的算法有三种:
- Record lock: 记录锁,单个行记录上的锁
- Gap lock: 间隙锁,锁定一个范围,不包括记录本身
- Next-key lock: record + gap 临键锁,锁定一个范围,包括记录本身。MySQL InnoDB 的 REPEATABLE-READ(可重读)并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁度使用到的机制就是 Next-Key Locks。
共享锁与排他锁
读之前加的是共享锁,写之前加的是排他锁。是属于悲观锁的思想。其中在串行(Serializable)级别中,读加共享锁,写加排他锁,读写互斥。使用的悲观锁的理论,实现简单,数据更加安全,但是并发能力非常差。如果你的业务并发的特别少或者没有并发,同时又要求数据及时可靠的话,可以使用这种模式。
- mysql架构,server层 + 引擎层;
- 连接器,查询缓存,分析器,优化器,执行器
- 两种存储引擎的对比
redo log vs binlog vs undo log,这块可以问得可深了...
redolog为啥crash safe, binlog为啥不是
如何恢复数据
何时刷新log/数据
https://juejin.cn/post/6855129007336521741
索引
B+树 vs B树
唯一索引vs普通索引
聚簇 vs 非聚簇
最左前缀匹配,给你个sql让你分析
回表/覆盖索引
索引设计
explain
事务,隔离级别(默认),脏读/不可重复读/幻读
MVCC,什么时候生成read view;如何判断哪些事务可见
锁(加锁才能实际解决幻读)
两阶段锁
record lock,gap lock, next key lock
数据库优化,读写分离,主从,分库分表等等
范式
手写嵌套查询
如何设计索引
执行顺序
给你个sql,让你分析如何加索引,使用了什么索引
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· c# 半导体/led行业 晶圆片WaferMap实现 map图实现入门篇
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!