我的求学应聘之路(面试题2)

毕业的第一次跳槽,去杭州,最近又在看面试题,看到一些别人写的很好的,拿过来整理一下。


前言

我最喜欢的一句诗是:天生我材必有用,你呢?


提示:以下是本篇文章正文内容,下面案例可供参考

一、MySQL 的逻辑架构

第一层是服务器层,主要提供连接处理、授权认证、安全等功能。
第二层实现了 MySQL 核心服务功能,包括查询解析、分析、优化、缓存以及日期和时间等所有内置函
数,所有跨存储引擎的功能都在这一层实现,例如存储过程、触发器、视图等。
第三层是存储引擎层,存储引擎负责 MySQL 中数据的存储和提取。服务器通过 API 与存储引擎通信,
这些接口屏蔽了不同存储引擎的差异,使得差异对上层查询过程透明。除了会解析外键定义的 InnoDB
外,存储引擎不会解析 SQL,不同存储引擎之间也不会相互通信,只是简单响应上层服务器请求。

在这里插入图片描述

二、 MySQL 的读写锁

在处理并发读或写时,可以通过实现⼀个由两种类型组成的锁系统来解决问题。这两种类型的锁通常被
称为共享锁和排它锁,也叫读锁和写锁。读锁是共享的,相互不阻塞,多个客户在同⼀时刻可以同时读
取同⼀个资源而不相互干扰。写锁则是排他的,也就是说⼀个写锁会阻塞其他的写锁和读锁,确保在给
定时间内只有⼀个⽤户能执行写入并防止其他⽤户读取正在写入的同⼀资源。
在实际的数据库系统中,每时每刻都在发⽣锁定,当某个用户在修改某⼀部分数据时,MySQL 会通过
锁定防⽌其他用户读取同⼀数据。写锁比读锁有更高的优先级,⼀个写锁请求可能会被插入到读锁队列
的前⾯,但是读锁不能插入到写锁前⾯。

三、 MySQL 的锁策略

1.表锁

是MySQL中最基本的锁策略,并且是开销最⼩的策略。表锁会锁定整张表,⼀个⽤户在对表进⾏写
操作前需要先获得写锁,这会阻塞其他⽤户对该表的所有读写操作。只有没有写锁时,其他读取的⽤户才能获取读锁,读锁之间不相互阻塞。

2.行锁

可以最⼤程度地⽀持并发,同时也带来了最⼤开销。InnoDB 和 XtraDB 以及⼀些其他存储引擎实
现了⾏锁。⾏锁只在存储引擎层实现,⽽服务器层没有实现。

四、 数据库死锁如何解决

死锁是指多个事务在同⼀资源上相互占⽤并请求锁定对⽅占⽤的资源⽽导致恶性循环的现象。当多个事务试图以不同顺序锁定资源时就可能会产⽣死锁,多个事务同时锁定同⼀个资源时也会产生死锁。
为了解决死锁问题,数据库系统实现了各种死锁检测和死锁超时机制。越复杂的系统,例如InnoDB 存储引擎,越能检测到死锁的循环依赖,并立即返回⼀个错误。这种解决⽅式很有效,否则死锁会导致出现非常慢的查询。还有⼀种解决方法,就是当查询的时间达到锁等待超时的设定后放弃锁请求,这种方式通常来说不太好。InnoDB ⽬前处理死锁的方法是将持有最少⾏级排它锁的事务进行回滚。
死锁发⽣之后,只有部分或者完全回滚其中⼀个事务,才能打破死锁。对于事务型系统这是无法避免的,所以应⽤程序在设计时必须考虑如何处理死锁。大多数情况下只需要重新执⾏因死锁回滚的事务即可。

五、 SQL事务

一、事务的基本要素(ACID)

1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

六、 MySQL 的隔离级别

未提交读 READ UNCOMMITTED

在该级别事务中的修改即使没有被提交,对其他事务也是可⻅的。事务可以读取其他事务修改完但未提交的数据,这种问题称为脏读。这个级别还会导致不可重复读和幻读,性能没有⽐其他级别好很多,很少使⽤。

提交读 READ COMMITTED

多数数据库系统默认的隔离级别。提交读满⾜了隔离性的简单定义:⼀个事务开始时只能"看⻅"已经提交的事务所做的修改。换句话说,⼀个事务从开始直到提交之前的任何修改对其他事务都是不可⻅的。也叫不可重复读,因为两次执⾏同样的查询可能会得到不同结果。

可重复读 REPEATABLE READ(MySQL默认的隔离级别)

可重复读解决了不可重复读的问题,保证了在同⼀个事务中多次读取同样的记录结果⼀致。但还是⽆法解决幻读,所谓幻读指的是当某个事务在读取某个范围内的记录时,会产生幻行。InnoDB 存储引擎通过多版本并发控制MVCC 解决幻读的问题。

可串行化 SERIALIZABLE

最高的隔离级别,通过强制事务串行执⾏,避免幻读。可串行化会在读取的每⼀⾏数据上都加锁,可能导致⼤量的超时和锁争用的问题。实际应⽤中很少⽤到这个隔离级别,只有非常需要确保数据⼀致性且可以接受没有并发的情况下才考虑该级别。

七、 索引的作用

索引也叫键,是存储引擎⽤于快速找到记录的⼀种数据结构。索引对于良好的性能很关键,尤其是当表中数据量越来越⼤时,索引对性能的影响愈发重要。在数据量较⼩且负载较低时,不恰当的索引对性能
的影响可能还不明显,但数据量逐渐增⼤时,性能会急剧下降。索引⼤⼤减少了服务器需要扫描的数据量、可以帮助服务器避免排序和临时表、可以将随机 IO 变成顺序 IO。但索引并不总是最好的⼯具,对于⾮常⼩的表,⼤部分情况下会采⽤全表扫描。对于中到⼤型的表,索引就⾮常有效。但对于特大型的表,建⽴和使⽤索引的代价也随之增⻓,这种情况下应该使⽤分
区技术。在MySQL中,⾸先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据⾏。索引可以包括⼀个或多个列的值,如果索引包含多个列,那么列的顺序也⼗分重要,因为 MySQL 只能使⽤索引的最左前缀。

八、 索引的作用

索引也叫键,是存储引擎⽤于快速找到记录的⼀种数据结构。索引对于良好的性能很关键,尤其是当表中数据量越来越大时,索引对性能的影响愈发重要。在数据量较小且负载较低时,不恰当的索引对性能
的影响可能还不明显,但数据量逐渐增⼤时,性能会急剧下降。索引大大减少了服务器需要扫描的数据量、可以帮助服务器避免排序和临时表、可以将随机 IO 变成顺序 IO。但索引并不总是最好的⼯具,对于非常小的表,⼤部分情况下会采用全表扫描。对于中到大型的表,索引就非常有效。但对于特大型的表,建立和使⽤索引的代价也随之增⻓,这种情况下应该使⽤分
区技术。在MySQL中,首先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行。索引可以包括⼀个或多个列的值,如果索引包含多个列,那么列的顺序也十分重要,因为 MySQL 只能使⽤索引的最左前缀。


总结

提示:没有完结,明天继续优化,晚安,打工人。2021.7.24.-------23.43

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值