字节面试官死磕Mysql,程序员心中暗喜:这是来跟我学经验的吧?

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

这里就有一个实例,程序员小陈去字节面试的时候,本没有多大的把握,在跟面试官介绍项目的时候,提到了对于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)更新。实现就是,这个数据所有请求都有资格去修改, 但会获得一个该数据的版本号,只有版本号符合的才能更新成功,其他 的返回抢购失败。

1. 乐观锁和悲观锁是什么,InnoDB 的标准行级锁有哪两种,解释其含义?
2. SQL 优化的一般步骤是什么,怎么看执行计划,如何理解其中各个字段的含义?
3. 数据库会死锁吗,举一个死锁的例子,mysql 是怎么解决死锁的?
4. MySQL 的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化?
5. 聚集索引和非聚集索引的区别?
6. select for update 是什么含义,会锁表还是锁行还是其他?
7. 为什么要用 Btree 实现,它是怎么分裂的,什么时候分裂,为什么是平衡的?
8. 数据库的 ACID 是什么?
9. 某一个表有近千万的数据,CRUD 比较慢,如何优化?

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
677957)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值