对于跳槽一线互联网大厂,需要会哪些技术,做哪些准备?我在前一篇文章说过,把你要去应聘岗位的职位要求中的技术点例举出来,然后根据这些技术点,进行查缺补漏。
一般情况下,面试官在问你问题的时候不是为了难倒你,而是要弄清楚,你到底会一些什么。
这时候,有几个自己十分擅长的版块是最好的,你可以引导面试官来问你最擅长的技术点,具体可以在项目介绍中讲一下,你用到了哪方面的技术,对于哪一个技术颇有心得,等等...
这里就有一个实例,程序员小陈去字节面试的时候,本没有多大的把握,在跟面试官介绍项目的时候,提到了对于MySQL数据库这一块的见解,自己怎么运用的优化方案等。
面试官对程序员小陈这一块的能力瞬间就产生了浓厚的兴趣,整个面试过程下来,问遍了MySQL的有关问题,甚至两个人就这一块的技术点互相探讨了起来。
2020年最新MySQL的面试问题
数据库隔离级别有哪些,各自的含义是什么,MySQL 默认的隔离级别是多少?
隔离级别有四种。
- 未提交读:是最低的隔离级别,其含义是允许一个事务读取另外一个事务没有提交的数据。会出现脏读。
- 读写提交:是指一个事务只能读取另一个事务已经提交的数据,不能读取未提交的数据。克服了脏读,但会出现不可重复读现象。
- 可重复读:克服读写提交中出现的不可重复读现象。但会出现幻读现象。
- 串行化:数据库中最高的隔离级别,她会要求所有的 SQL 都会按照顺序执行,这样就可以克服上述隔离级别出现的各种问题,所以它能完全保证数据的一致性。
MySQL 默认的隔离级别是可重复读。
什么是幻读?
幻读是指在同一个事务下,连续执行两次同样的 SQL 语句可能导致不同的结果, 第二次的 SQL 语句可能会返回之前不存在的行。
事务 A 读取与搜索条件相匹配的若干行,事务 B 以插入或删除行等方式来修改事务 A 的结果集,然后再提交,就会发生幻读。例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样。
在默认的事务隔离级别下,即 REPEATABLE READ(可重复读)下,InnoDB 存储引擎采用 Next-Key Locking 机制来避免幻读。
MySQL 有哪些存储引擎,各自优缺点?
MySQL 支持 InnoDB、MyISAM、MEMORY 等存储引擎。
InnoDB 引擎(MySQL5.5 以后默认使用):
- 灾难恢复性好
- 支持事务
- 使用行级锁和表级锁,能支持更多的并发量
- 查询不加锁
- 支持外键关联
- 支持热备份
- 实现缓冲管理
MyISAM 引擎:
- 不支持事务
- 使用表级锁,并发性差
- 主机宕机后,MyISAM 表易损坏,灾难恢复性不佳
- 可以配合锁,实现操作系统下的复制备份、迁移
- 只缓存索引
- 数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能
两者主要区别:
- InnoDB 支持事务,MyISAM 不支持事务处理等高级处理。
- InnoDB 支持行级锁,而 MyISAM 仅支持表级锁。
- MyISAM 类型的表强调的是性能,其执行速度比 InnoDB 类型更快。
- MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用。
- InnoDB 支持外键,MyISAM 不支持。
- MyISAM 支持全文搜索,而 InnoDB 1.2.x 版本后才支持。
- 对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在MyISAM 表中可以和其他字段一起建立联合索引。
高并发下,如何做到安全的修改同一行数据?
- 使用悲观锁。本质是当前只有一个线程执行操作,排斥外部请求的修改。遇到加锁的状态,就必须等待。结束了唤醒其他线程进行处理。但是, 我们的场景是“高并发”。也就是说,会很多这样的修改请求,每个请求 都需要等待“锁”,某些线程可能永远都没有机会抢到这个“锁”,这种请求就会死在那里。
- FIFO(先进先出)缓存队列思路,直接将请求放入队列中,这样就不会导致某些请求永远获取不到锁。有点强行把多线程变成单线程的感觉。
- 使用乐观锁。相对于“悲观锁”采用更为宽松的加锁机制,大都是采用带版本号(Version)更新。实现就是,这个数据所有请求都有资格去修改, 但会获得一个该数据的版本号,只有版本号符合的才能更新成功,其他 的返回抢购失败。
- 乐观锁和悲观锁是什么,InnoDB 的标准行级锁有哪两种,解释其含义?
- SQL 优化的一般步骤是什么,怎么看执行计划,如何理解其中各个字段的含义?
- 数据库会死锁吗,举一个死锁的例子,mysql 是怎么解决死锁的?
- MySQL 的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化?
- 聚集索引和非聚集索引的区别?
- select for update 是什么含义,会锁表还是锁行还是其他?
- 为什么要用 Btree 实现,它是怎么分裂的,什么时候分裂,为什么是平衡的?
- 数据库的 ACID 是什么?
- 某一个表有近千万的数据,CRUD 比较慢,如何优化?
- MySQL 是怎么优化 table scan 的?
- 如何写 SQL 能够有效地使用到复合索引?
- MySQL 中 in 和 exists 的区别?
- 数据库自增主键可能的问题?
- MVCC 的含义,如何实现的?
- MySQL 的主从延迟怎么解决?
- 什么是回表,覆盖索引有什么作用?
- B+Tree 索引和 Hash 索引区别?
- 在 Mybatis 中,占位符$和#的区别(防止 SQL 注入)?
- SQL 的注入攻击是什么,如何防范?
- 什么时候添加 B+树索引?
- MySQL 的嵌套事务?
- 给出一个学生成绩 studuent 表,写一个 SQL 语句,统计每个学生所有成绩平均分大于 80 分的结果?
- MySQL 中一条 SQL 语句的执行过程?
- MySQL 中 int(11)中的 11 代表什么含义?
- InnoDB 中为什么采用 B+树结构,而不是平衡树?
- MySQL 索引的“创建”原则?
- 为什么官方建议使用自增长主键作为索引?
- MySQL 主从复制的作用和原理?
- MySQL 事务日志?
- JOIN 的用途?
- PreparedStatement 和 Statement 的区别?
- 数据库第一、第二、第三范式的理解?
- MySQL 半同步复制原理?
- MySQL 中 Distinct 与 Group by 的区别?
更多的答案解析,我这里就不一一例举出来了,避免文章篇幅过于冗长。下面截几张图,给大家参考一下,需要文档资料的话,帮小天转发一下文章,后台私信【数据库】免费领取!
获取完整MySQL面试资料,加VX:bjmsb10 免费领取!