专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 职业指南 mysql优化面试题,经典收藏版

mysql优化面试题,经典收藏版

更新时间:2022-12-29 15:32:46 来源:星辉 浏览2179次

1.事务的四大特征:

答: 我了解事务的四大特征,他们分别是原子性,一致性,隔离性,持久性。

原子性:

一系列sql语句要么执行,要么不执行,是不可分割的,不能执行一部分。

一致性:

定义是:要么是完全执行的状态,要么是完全不执行的状态。,我个人的理解是:一致性是说的业务层面的,例如银 行转账业务,一张卡减掉200元,另一张卡必须增加200元,不存在此消不彼长的情况。

隔离性:

1:一个事务在执行过程中其他的事务是不可见的。

2:一个事务在修改一个数据的时候另外一个事务不允许对这个数据进行修改。晚的事务会阻塞状态,等第一个事务执 行完,第二个事务解阻塞。

持久性:

一旦事务提交数据就保存在数据库中,持久保存。

2.脏读,幻读,不可重复读:

脏读:读到没有提交的数据。

案例:A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。

不可重复读:读到两个不一样的数据。(指的是数据内容)

案例:A先读取数据为100,此时B事务修改该数据为200,然后提交。A再次读取数据为200。这种情况就是不可重复读。

幻读:读到两个不一样的数据集。(指的是整体的数据集)

案例:A先读取数据集一共100条数据,此时B事务增加了200条数据,然后提交。A再次读取数据,发现数据集变成了300条。这种情况就是幻读。

3.事务的隔离级别:

答:事务的隔离级别有四种:从高到底分别是:串行化(serializable), 可重复读(Repeatable-Read), 读已提交(Read-Commited),读未提交(Read-Uncommited),Mysql默认的隔离级别是:可重复读(Repeatable-Read),而SQLServer,Oracle默认的事务的隔离级别是:读已提交(Read-Commited)。

串行化:A事务结束之后,B事务才能开始。

可重复读:事务开启后,读取的数据永远是开启事务时的状态。

读已提交:一个事务要等另一个事务提交后才能读取数据。

读未提交:一个事务能够读取到另一个事务没有提交的数据。

4.读未提交解决:脏写问题:

它的本质就是一个事务将另一个事务提交的修改操作回滚了

首先是事务 A 将数据的值修改为 data1,暂时不提交事务;

然后事务 B 将数据的值修改为 data2,然后立马提交事务;

事务 A 可能由于自己的业务系统出现了异常,因此进行回滚操作,将数据的值重新回滚为 data。

解决方案: 加写锁。要对数据修改,必须要先获取到这行数据的写锁,否则不能修改。

而我们的读未提交就解决了脏写的问题。因为读未提交是不允许写的,只能读。在该隔离级别下,能保证事务提交之前,其他事务不能同时对这条数据进行修改。

5.读已提交解决:脏读问题:

脏读,只是在读未提交的状态下发生的。在读未提交状态下,因为这个状态下能够读到另外一个事务没有提交的数据。

案例:

事务 A 和事务 B 同时执行,事务 A 先将数据从 data 修改为 data1,然后暂时不提交事务。

然后事务 B 读取这一行数据,读取到值为 data1,此时事务A进行回滚,则事务B读到的就是脏数据。

为了解决这个脏读的问题,数据库设计了读已提交的隔离级别。在读数据的时候,只能读到别的事务提交过后的值,对于未提交的事务对数据所做的修改操作,当前事务是无法读取到的。

在读提交的事务隔离级别下,当事务 B 去读取数据时,发现事务 A 还没有提交,因此它不能读取到 data1 这个值,只能读取到 data 这个值。

6.可重复读隔离级别解决:不可重复读问题:

不可重复读问题:

案例:(假设在读以提交隔离级别下)

事务 A 和事务 B 同时开启事务,事务 A 先从数据库查询数据,读取到的值为 data,然后事务 A 先不提交事务。

接着事务 B 修改数据,将数据的值从 data 修改为 data1。然后提交事务,事务A再次查询数据,得到的是data1。

此时A两次读取的数据不一致?这就是不可重复读。

为了解决这个不可重复读的问题:数据库设计了可重复读的隔离级别。

它的意思是,在同一个事务内,例如事务 A,多次从数据库读取数据时,每次读取到的值是一样的,即使在此期间有其他事务修改了这条数据的值,也不会导致事务 A 前后两次读取到的值不一样。

7.MyISAM索引与InnoDB索引的区别?

InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。

InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。

MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。

InnoDB支持外键,而MyISAM不支持。

InnoDB支持事务,MyISAM不支持。

Innodb不支持全文索引,而MyISAM支持全文索引。

InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁。

8.索引的建立有哪些原则吗?

经常查询,不同意改,重复值比较少。

联合索引的最左原则。mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

以上就是“mysql优化面试题,经典收藏版”,你能回答上来吗?如果想要了解更多的Java面试题相关内容,可以关注星辉Java官网。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>