shopee 二面面经及答案
写在前面
大家好,我是小牛, 微软程序员一枚,之前经常看见大家在 牛客上有 面经分享,但大多数没有答案。由于小牛和几个BAT小伙伴整理了相关八股文题库,这次就当一回工具人,把题目和对应的答案奉上。
这次面经基本都被我之前整理的大厂面试八股文涵盖了,有兴趣的同学可以到我之前的讨论贴查看我之前整理的八股文
mysql为什么要用自增id作为主键
直接原因是其存储机制。MySQL采用数据页进行数据存储。如果采用自增主键,在原先数据页写满的情况下,MySQL对于新数据,直接开辟新页进行写操作。如果不采用自增主键,为保障索引有序,新数据需插入到合适位置上,由此针对页数据满的情况下,MySQL需要申请新页,并将一部分之前的页数据挪到新页上,保证按索引有序存储,相对自增主键IO开销更大。
索引覆盖了解吗
覆盖索引指一个索引包含或覆盖了所有需要查询的字段的值,不需要回表查询,即索引本身存了对应的值。
大数据量的分页查询怎么优化
定位对应索引id所处的偏移位置,之后进行查询。
select * from table where num = 8 limit 100000,1;
变为
select * from table where num = 8 and id >= ( select id from table where num = 8 limit 100000,1 ) limit 100;
由于id走了索引,因此速度会有一定提升。
分库分表怎么做
对于分库,即将一个数据库拆分为多个库。
可以通过水平拆分(按行拆分),或者垂直拆分(按列字段重新拆分多表)的方式,将表进行拆分。
一般可以采用中间件Sharding-JDBC进行分库分表。
分布式事务解决方案
两阶段提交:在这个过程中,有两个角色,分别为master和slave 表决阶段:对于所有slave都将本事务能否成功的信息反馈发给master;执行阶段:master根据所有slave的反馈,通知所有slave,步调一致地在所有分支上提交或者回滚;
简述MySQL主从复制
MySQL提供主从复制功能,可以方便的实现数据的多处自动备份,不仅能增加数据库的安全性,还能进行读写分离,提升数据库负载性能。
主从复制流程:
在事务完成之前,主库在binlog上记录这些改变,完成binlog写入过程后,主库通知存储引擎提交事物 从库将主库的binlog复制到对应的中继日志,即开辟一个I/O工作线程,I/O线程在主库上打开一个普通的连接,然后开始binlog dump process,将这些事件写入中继日志。从主库的binlog中读取事件,如果已经读到最新了,线程进入睡眠并等待ma主库产生新的事件。读写分离:即只在MySQL主库上写,只在MySQL从库上读,以减少数据库压力,提高性能。
简述Redis过期策略
定期删除,redis默认是每100ms就随机抽取一些设置了过期时间的key,并检查其是否过期,如果过期就删除。因此该删除策略并不会删除所有的过期key。
惰性删除,在客户端需要获取某个key时,redis将首先进行检查,若该key设置了过期时间并已经过期就会删除。
实际上redis结合上述两种手段结合起来,保证删除过期的key。
简述缓存穿透
缓存穿透指缓存和数据库均没有需要查询的数据,攻击者不断发送这种请求,使数据库压力过大
简述缓存击穿
缓存击穿指缓存中没有数据,但数据库中有该数据。一般这种情况指特定数据的缓存时间到期,但由于并发用户访问该数据特别多,因此去数据库去取数据,引起数据库访问压力过大
简述缓存雪崩
缓存雪崩指缓存中一大批数据到过期时间,而从缓存中删除。但该批数据查询数据量巨大,查询全部走数据库,造成数据库压力过大。
原题出处: https://www.nowcoder.com/discuss/687891
#Java开发##面经##Shopee#