字节-技术中台 -校招-Java一面
大约 3 分钟
字节-技术中台 -校招-Java一面
自我介绍环节
先做两道算法题
k个一组反转链表(15min)
手动构造链表和输入输出,力扣原题
问实习项目,那个慢查询怎么做的?
简述MySQL主从复制
binlog是怎么用的?有几种格式?
你刚才提到有这么多不同的格式?
为什么?避免uuid()等不同函数导致的主库和从库数据不同、以及申请自增主键的产生的主库和从库数据不一致的问题
主库和从库个数一般怎么配置?
说了一主三从
索引底层的数据结构?
你在实习的时候给表加索引,会锁表对吧?有没有一种办法你给一个表上锁,但是不影响其他事务对这个表的读和写?
这个的话不知道,瞎说的 目前不太了解这种机制,但是如果我来实现的话,我会仿造Redis里边那个AOF文件重写的思路,大概是这样的:就是将原来的表fork()一份,然后之后的读写请求都先写到这张临时表中,等到加索引的事务结束了,然后将临时表的数据再刷回到原表中
你提到了将临时表的数据刷回到原表中,你有没有想过有线程安全问题呢?
这个的话主要看刷表操作是怎么实现的,像AOF的实现就是直接替换AOF文件
如果是MySQL的话,我觉得可以直接替换.ibd文件
追问:替换.ibd文件这个过程,会导致事务无法读写吗?
如果表特别大,你光是fork()的时间都超过了加锁和解锁的时间,怎么办?
….不会了
binlog可以实现持久化吗?MySQL中还有哪些日志
假设MySQL提交事务之前崩溃了,怎么恢复?
说说两阶段提交协议
实习的那个项目有没有分库分表之类的操作(埋下伏笔)
如果让你设计一张表,你会考虑什么呢?
主键
查询条件要加索引
尽量使用char而不是varchar
NOT NULL DEFAULT
数据库三范式
细说数据库三范式?开发中是不是铁律一定要遵守的?
场景:10WTPS,可以加中间件,问你如何缓冲压力,避免压力全部打到一个MySQL集群上?
思路:使用Redis缓存来缓冲一部分的压力,可以将MySQL中部分数据提前缓存到MySQL中,让流量打到Redis上
追问:你用这个Redis,是只用来接收读请求吗?
不是的,10WTPS一旦打到单机的MySQL上去就会挂,这种情况下最好让Redis即接收读请求和写请求,这里的话使用的策略是叫做 写回策略,原理和操作系统的PageCache差不多 就是我们的业务无论是读请求和写请求都去操作缓存,一旦做了写的操作,就将这个缓存设置为脏数据,然后我们开一个服务,这个服务会定期将脏数据刷回到数据库
追问:注意10WTPS,如果都是写请求,而你的MySQL只有1w的处理能力,那你那个刷脏的时间和频率要怎么设计?
其实这里面试官就在引导我增加MySQL的实例来提高QPS了…当时脑袋闷闷的,还是在说Redis 刷脏的这个线程不要超过MySQLTPS限制即可