字节二面
自我介绍
MySQL性能问题
- 问题:MySQL到60W条数据之后就不行了
- 优化方法:加索引
索引底层原理
- B+树
- B树与B+树的区别
- B树:一个节点存所有信息
- B+树:非叶子节点存的是比较信息,B+树会显得是矮胖型的
- 矮的含义:非叶子节点存储的信息少,如果把信息看着高度,B+树会显得矮
- 好处:查找需要磁盘到内存的IO,这种设计IO的数据量少
联合索引问题
- 问题:联合索引失效
- SQL问题:未回答上来
- 项目建索引建议
- 建议:联合索引
- 理由:查的时候要从省份查到村
服务类型
- 单机服务
- 分布式了解:了解过,原来用nginx的轮询来轮询两台服务器
nginx分布式配置
- 问题:如何将nginx做成分布式的?
URL到网页的过程
- DNS解析
- HTTP请求前端
- 浏览器渲染再次请求
存储省份和市区信息
- 使用zset
- 为什么快:跳表,复杂度降到log(n)
- 为什么不使用hash:hash的实现和时间复杂度未提及
进程与线程
- 进程:操作系统管理,切换代价大,内存隔离性高
- 线程:进程管理,可以共享内存
- 进程间通信:管道,socket,共享内存
TCP协议
- 滑动窗口:防止消息覆盖
- 慢启动:初始值较低,指数上涨探寻最大网速
字符串处理
- String,StringBuffer,StringBuilder的区别
- String:内存分配
- StringBuilder:为了让字符串操作更快,改进了String的不可变性
虚拟内存
- 思路:一部分暂时不用的分到磁盘,用了再load到内存里面
- 是否连续:不是
- 如何取得物理位置:操作系统管理,C语言有对应函数(具体函数未提及)
线程安全与并发
- 了解过线程安全和并发写竞争
- Java同步:synchronized
- 分布式同步:Redis分布式锁
锁问题
- 锁重入问题:使用LUA脚本串行解决(具体细节未提及)
- 服务挂掉问题:给锁加过期时间
- 业务执行长问题:未提及具体解决方案
算法问题
- 题目描述:奇数位升序,偶数位降序的单向无环链表升序排序
- 输入:1->10->5->9->12->0
- 输出:0->1->5->9->10->12
- 初始思路:奇数压到队列,偶数压到栈
- 面试官建议:原地拆链,偶数链反转,合并
- 问题:空间复杂度优化
闲聊与面试建议
- 面试官提到面试者的博客和GitHub,询问是否都是自己编写的内容
- 面试者提到操作系统和编程语言的学习背景
- 面试建议:在考虑解决方案时思考应更深入,不应直接跳到使用Redis