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

三级目录

相关推荐
AllData公司负责人1 小时前
大模型赋能AllData数据中台,系列升级|通过联合智谱大模型与Chat2DB开源项目,建设Text2SQL生产场景全新体验的数据源平台!
数据库·人工智能·text2sql·数据中台·数据源·chat2db·智谱大模型
是一个Bug2 小时前
MySQL 核心知识梳理:从底层原理到实战优化
mysql
minji...2 小时前
MySQL数据库 (四) MySQL的数据类型,tinyint,float,decimal,枚举enum和集合set
数据库·mysql·tinyint·enum·decimal·varchar·bit
阿演2 小时前
DataDjinn 新版本更新:国产数据库支持、连接树体验、AI 查询和表格编辑继续增强
数据库·人工智能·ai·ai编程
一只fish3 小时前
Oracle官方文档翻译《Database Concepts 26ai》附录-术语表
数据库·oracle
一只fish3 小时前
Oracle官方文档翻译《Database Concepts 26ai》第23章-数据库开发者概念
数据库·oracle
todoitbo3 小时前
从 MySQL 到 KingbaseES:Database、Schema、User 一次讲透
数据库·mysql·国产数据库·kingbasees
勇往直前plus3 小时前
Redis&Python 梳理
数据库·redis·python
千云4 小时前
100w大表0停机回滚:我们为什么放弃Undo Log,选择表名切换?
数据库·后端·mysql