MySQL面经整理

MySQL面经整理

一、MySQL存储引擎

1.1)MySQL支持哪些存储引擎?默认使用哪一个?

MySQL采用插件式存储结构,不同的存储引擎负责数据的存储和读取方式,因此他们在事务支持、锁机制、性能等方面不同。

通过show engines 可以查看当前数据库支持的存储引擎。

Mysql5.5之后默认存储引擎就是 InnoDB。

1.2)MyISAM和InnoDB的区别

首先,InnoDB支持事务,能够保证数据一致性,MyISAM不支持事务。

其次,InnoDB支持行级锁和MVCC,而MyISAM只支持表级锁,因此在高并发写入场景下,InnoDB的性能更好。

第三,InnoDB支持外键约束,可以维护表之间的数据完成性,而MyISAM不支持外键。

第四,InnoDB 具有崩溃数据恢复能力,即使数据库异常宕机,也可以通过Redo Log恢复数据。而MyISAM不支持。

此外,InnoDB使用聚簇索引,数据存储在主键索引叶子节点中;MyISAM使用非聚簇索引,索引和数据分离存储。

二、MySQL 事务

2.1)事务的四大特性(ACID)

MySQL事务具有ACID四大特性

  1. 原子性:事务中的操作是一个不可分割的整体,要么全部成功,要么全部失败,通过Undo Log实现。
  2. 一致性:事务执行前后数据库始终保持合法状态。
  3. 隔离性: 多个事务并发执行时互不干扰,主要通过锁机制和MVCC实现。
  4. 持久性:事务提交后的数据永久保存,即使数据库宕机也不会丢失,通过Redo Log 实现。

2.2)事务并发带来哪些问题?不可重复读和幻读的区别?

事务并发执行时可能产生三类问题:

  1. 脏读:读取到其他事务未提交的数据
  2. 不可重复读:同一事务多次读取同一条记录,结果不一致
  3. 幻读:同一事务中多次查询符合条件的记录,记录数量发生变化。
    MySQL通过事务隔离级别来解决这些问题。InnoDB默认采用RR(Repeatable Read,可重复读)隔离级别,结合MVCC和Next-key Lock 机制解决大部分并发一致性问题。

幻读是查询结果集的行数发生变化,不可重复读是同一行数据值被修改。

脏读

一个事务读取到了另一个事务未提交的数据,如果对方回滚,那么读取到的数据就是无效的。

比如:事务A修改了id = 1的一条数据,但是并未提交事务。此时,事务B读取的id =1 的这条数据,之后事务A回滚了,修改的数据从未真正存在过,却被事务B读取到了。

不可重复读

同一事务中,两次读取同一条数据,由于其他事务提交了更新操作,导致两次读取结果不同。

比如 : 事务A开启第一次读取id =1的数据,此时事务B开启,修改了id = 1的这条数据,并提交事务。事务A再次读取id = 1的数据,两次结果不一样。

幻读

同一个事务中,两次按照相同条件查询数据,由于其他事务插入或删除了满足条件的记录,导致查询结果集的数量发生变化。

比如:

一张用户表

bash 复制代码
id  age
1    20
2    21

事务A开启事务,查询age > 18的所有数据,结果有2条。

接着,事务B开启事务,插入一条数据 (3,22) 并提交事务。

此时,事务A再次查询 age > 18 的所有数据,结果有3条。

2.3)MySQL 事务隔离级别?默认是什么级别?

MySQL事务隔离级别有四种:读未提交(Read Uncommitted),读已提交(Read Committed), 可重复读(Repeatable Read),串行化(Serializable)。

RU最低的隔离级别,会产生脏读;

RC,解决了脏读,但是会出现不可重复读和幻读问题;

RR,解决了脏读和不可重读读的问题,MySQL InnoDB默认的隔离级别;

Serializable,隔离级别最高,但是性能最差;

另外需要注意,按照 SQL 标准,可重复读仍可能出现幻读,但 MySQL InnoDB 通过 MVCC 和 Next-Key Lock 机制,在大多数场景下避免了幻读。这样兼顾了数据一致性和并发性能。

RU

最低的隔离级别。一个事务可以读取到其他事务尚未提交的数据(脏读)。

RC

只能读取已经提交的的数据。解决了脏读问题。

RR

MySQL InnoDB默认的隔离级别。

保证同一事务内多次读取结果一致。

解决了脏读、不可重复读的问题。

SQL标准下,可重复读不能完全解决幻读;但MySQL InnoDB通过MVCC和临键锁机制,在很大程度上避免了幻读问题。

串行化

最高的隔离级别。所有事务排队执行。解决了脏读、不可重复读、幻读问题,但是性能最差。

2.4)MySQL的隔离级别是基于锁实现的么?

不完全是。InnoDB 的事务隔离级别主要通过 MVCC 和锁机制共同实现。

Read Committed 和 Repeatable Read 的一致性读主要依赖 MVCC,通过 Read View 读取数据快照;而为了解决幻读问题,Repeatable Read 在当前读场景下会结合 Next-Key Lock。最高级别 Serializable 则主要依赖锁机制实现事务串行执行。因此不能简单地说 MySQL 的隔离级别完全基于锁实现。

2.5) InnoDB对MVCC的具体实现

三级目录

相关推荐
YangYang9YangYan17 分钟前
2026 电商数据运营校招 JD 梳理|岗位任务、技能与面试考点汇总
大数据·数据库·数据分析
Sun 328518 分钟前
读懂集中式主备的集群状态与节点角色
数据库·opengauss·集群·节点角色·磐维数据库·运行状态
毕业设计70330 分钟前
(免费领源码) SpringBoot 游戏交易平台17600-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·spring boot·mysql·决策树·mybatis·idea·推荐算法
溪语流沙39 分钟前
Django + Vue电商项目第001讲:开篇|注册登录加增删改查,那不是电商
redis·python·mysql·docker·typescript·django·vue
努力努力再努力wz1 小时前
【Redis进阶系列】:从主从复制到 Sentinel,一文建立故障检测、Leader 选举与 Failover 的完整心智模型
数据库·redis·缓存
达梦数据1 小时前
DMDRS搭建部署简介与运行环境
数据库
Omics Pro1 小时前
1个月2轮融资!长寿虚拟细胞
数据库·人工智能·算法·机器学习·自然语言处理
程序员阿黄1 小时前
基于 Django 与 Vue 3 的智能实验室预约系统设计与实现
后端·python·mysql·django·vue·毕设
zcn1261 小时前
row_number()函数与group by性能比较
数据库·sql优化改写
小K讲AI营销2 小时前
AI基础设施融资路径的中美比较:资本市场模式与政策金融模式
大数据·数据库·人工智能