目录
如何解决这些高频面试题?
大致回答思路如下:
谈谈如何理解索引?
- 索引是干什么的(解决了什么问题)
- 索引付出的代价
- 索引背后的数据结构
谈谈如何理解事务?
- 事务是干什么的(从原子性切入)
- 事务还有其他什么特点
- 重点讲述隔离性,在并发事物下会有哪些问题,以及如何解决问题
- MySQL的隔离级别有哪些,和上面的问题如何应对
有想法了吗?
索引
1.索引的效果:可以加快查找效率;
2.索引的代价:浪费空间,降低增删查改的效率
3.背后的数据结构:B+树(N叉搜索树)
这里博主已经整理出十分详细的博客啦,可以来看看~
事务
通俗来讲,就是干一件事,要么全都执行完,要么一个都不执行~
(从特性切入讲给面试官,先从原子性开始):这里就不得不说以下他的一大特性:原子性。什么是原子性呢?都知道的是以前物理书上讲:原子是不可分割的最小单位(当时科技还不发达,其实原子还可以再分为原子核和核外电子,原子核又是中子和质子构成,夸克…哈哈扯多了)后来就把这个术语沿用到计算机领域了,事务就是用来保证原子性的;
举个栗子,例如一个转账服务,张三给王五微信转账500块钱,那么就需要从张三的微信中扣除500元,接下来给王五的微信账户中加上500元,但是万一在这个转账的过程中(执行王五收账的这条代码还没有执行)出现了故障(例如断电),那么给王五转账的那500元就收不到了~
这个时候啊,需要按照原子的方式来进行,要么都执行,要么一个都不不执行(不是说真的 不执行,而是执行到一半出现问题的时候,能够自动回复如初);
事务就能保证,如果执行到一半出问题时,自动进行还原,恢复如初,这叫做——”回滚“,在事务进行的过程中MySQL都会记录每步干了什么,一旦遇到问题,就可以根据记录回滚~;
面试官:“把原子性总结一下吧~”;
原子性:事务的根本所在(也是事务存在的意义),能够把多个sql语句打包成一个整体,要么都执行完,要么一个都不执行(如果出错,直接回滚);
如果面试管继续问:“除了原子性之外,另外三个特性呢?”;
一致性:事务执行前后,数据处在“一致”状态;(数据能对的上,合情合理)
持久性:事务进行的改动都是在硬盘里的,不会随着主机的(重启 / 关机)而丢失数据;
隔离性(隔离性最复杂,也是面试管最想听到的(看你能不能讲清楚~)):多个事务并发执行的时候,事务之间可以保持“隔离”,互不干扰;
面试管引导你:“什么是并发执行呢?”。
MySQL的本体就是服务器,执行sql语句,本质也是客户端把sql发送给服务器,让服务器去执行;事务也是将sql语句发给服务器执行,而同一时刻,多个客户端都在给服务器发送事务,让他执行,这便是“并发执行”(简单理解就是同时做很多事情~);
面试管:“那隔离是为什么呢?”。
如果这些并发执行的事务是对多种不同的数据库 / 不同的表 操作,那就没事了~
但是如果操作的同一数据库,同一个表,那就可能要“打架”了!
隔离存在的意义,就是让并发执行的事务,尽量避免“打架”(使问题控制在可控范围之内~);
面试官:“为什么会‘打架’呢?”
情况一:脏读
举个栗子,我的妈妈说:“咱们中午在家吃饭吧~”,而我的媳妇却说:“咱们中午出去吃吧~”,在这种冲突之下,该做何选择?说不准吧~
讲个有意思的栗子:你和你妈掉水里了,你救哪个?我:救我妈,然后我也跳河里,一起坠入爱河~
在说个详细点的,想象这样一个场景,我在上班的时候敲代码,然后我的同事跟我要完成同一个任务,但他在一旁暗中观察,他看到我这样写:“class list { public int val; publi…”;然后他没看完就走了,他或许还会想:“原来要这样写,我真是给大聪明!”;是啊,真是个大聪明,顺便提一嘴,在公司工作的时候不要抄袭别人代码!!!后果很严重!!!言归正转,他走了之后,我忽然发现刚刚写的代码有点问题,我就给改了~
这就是属于脏读问题,脏读数据,就是一个零时数据,不代表结果;
脏读:一个事务A在修改数据之前,事务B读取了数据,然后A修改了数据,那么此时B读到的就是“无效的数据”,简称:脏读。
情况二:不可重复读
我说,等我整个程序做完了,交给老板后,上传码云,你再看着学习吧;等我提交之后,我突然又有了一些想法,就直接开始在码云上改,而同事真好在看码云,忽然发现,代码变了~
不可重复读:在一个事务A中,多次读取数据发现不一样(读的过程中被修改了);
情况三:幻读
既然约定,你读的时候我不能改,那么我这样想,你读文件A的时候,我去修改B;(掩耳盗铃,同事刚读完的B文件,我就去修改,别人不看就说明我能修改…);
幻读:可以视为“不可重复读”的特殊情况,两次读虽然关心的数据一样,但结果集变了。
面试官:“那么如何解决脏读、不可重复读、幻读问题呢?”;
解决脏读:写加锁
我跟那个同事说,你就不要看我的代码了,等我把任务完成,提交给老板,我在把码云发出来,你可以学习以下~
在提交之前不能读,提交之后才能读;
相当于对写操作,加锁;
分析:加锁前,我写的操作,和同事读的操作是并发的(效率最高),隔离性最低(准确性最低);加锁后,我写的操作时,同事不能读了,只有等我上传码云之后才能读,并发性降低了(效率变低了),隔离性变高(准确性变高了);
解决不可重复读:读加锁
在写加锁的基础上,同事跟我说,我读的时候你就不要修改了~
在我写的时候,你不能读,你读的时候我不能写;
你看的时候我不能修改,这就是读加锁;
分析:此时并发性进一步降低(效率降低),隔离性进一步提高(准确度提高)
解决幻读问题:串行化
咱就是说,只要你在读代码,我就关机,什么都不要做,代码一点都不能动!
分析:此时并发性最低(效率最低),隔离性最高(准确度最高);
面试官:“既然有利有弊,真的遇到问题了你会如何处理呢?”;
如果需求对于精确度要求不高,因此就可以让并发性高一点,隔离性低一点,提高效率;(例如:点赞数,浏览量…)
如果需求对于精确度要求高,因此就可以让并发性低一点,隔离性高一点,提高准确度;(例如:有关钱财问题…)
事务的四种隔离级别
1.read uncommitted;
允许读未提交的数据,并发程度最高,隔离性最低,可能存在 脏读/不可重复读/幻读 问题;
2.read committed;
只能读提交之后的数据,相当于写加锁,并发性降低,隔离性提高,解决脏读问题,可能存在不可重复读,幻读问题;
3.repeatable read;(默认)
相当于读和写都加锁了,并发性再次降低,隔离性再次提高,解决 脏读/不可重复读,可能存在幻读问题;
4.serializable;
严格执行串行化,并发性最低,隔离性最高,解决 脏读/不可重复读/幻读问题
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/124341.html