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的具体实现

三级目录

相关推荐
GBASE5 小时前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr15 小时前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
唐青枫2 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
吃糖的小孩2 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
小满8782 天前
5.Mysql事务隔离级别与锁机制
mysql
笃行3502 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3502 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3502 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
元Y亨H2 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql