全栈工程师初面实战题目
一、MySQL 数据库
1. 怎么分析 MySQL 的索引?
回答要点:
- 使用
EXPLAIN分析执行计划,关注:type:ALL(全表) < index < range < ref < eq_ref < constkey:实际使用的索引rows:预估扫描行数Extra:Using index(覆盖索引)、Using filesort(需优化)、Using temporary(需优化)
- 使用
SHOW INDEX FROM table_name查看索引信息 - 慢查询日志定位问题 SQL
2. 索引的最左匹配规则?
回答要点:
- 联合索引
(a, b, c)的匹配规则:- √
WHERE a=1、WHERE a=1 AND b=2、WHERE a=1 AND b=2 AND c=3 - ×
WHERE b=2、WHERE c=3、WHERE b=2 AND c=3(不走索引)
- √
- 范围查询会中断匹配:
WHERE a=1 AND b>2 AND c=3,c 用不到索引 - 顺序无关:优化器会自动调整,
WHERE b=2 AND a=1也能用索引
3. 一条 SQL 的执行流程?
回答要点:
客户端 → 连接器(权限验证) → 查询缓存(8.0已移除)
→ 分析器(词法/语法分析) → 优化器(执行计划/索引选择)
→ 执行器 → 存储引擎(InnoDB)
- 连接器:管理连接、身份认证
- 分析器:词法分析(识别关键字)、语法分析(语法校验)
- 优化器:选择索引、决定 JOIN 顺序
- 执行器:调用存储引擎接口获取数据
4. 数据库告警高 CPU 怎么处理?
回答要点:
- 定位问题 SQL:
-- 查看当前执行的SQL SHOW FULL PROCESSLIST; -- 或查询慢查询日志 - 常见原因及解决:
- 全表扫描 → 添加合适索引
- 复杂 JOIN → 拆分查询、优化索引
- 锁等待 → 检查死锁、优化事务
- 大量连接 → 检查连接池配置、是否有连接泄漏
- 紧急处理:
KILL问题查询,限流降级
二、Elasticsearch
5. 同步大量数据到 ES 怎么处理?
回答要点:
- 全量同步:
- 使用 Bulk API 批量写入(每批 1000-5000 条)
- 同步前关闭
refresh_interval,完成后再开启 - 设置
number_of_replicas=0,完成后恢复
- 增量同步方案:
- Canal 监听 MySQL Binlog → MQ → ES
- 业务双写(注意一致性)
- Logstash 定时拉取
- 注意事项:
- 控制并发数,避免压垮 ES
- 做好失败重试和断点续传
- 数据校验(对账)
三、Spring 框架
6. Spring 用了哪些设计模式?
| 回答要点: | 设计模式 | 应用场景 |
|---|---|---|
| 工厂模式 | BeanFactory、ApplicationContext 创建 Bean | |
| 单例模式 | Bean 默认 scope=singleton | |
| 代理模式 | AOP 动态代理(JDK/CGLIB) | |
| 模板方法 | JdbcTemplate、RestTemplate | |
| 观察者模式 | ApplicationEvent 事件机制 | |
| 适配器模式 | HandlerAdapter 处理不同类型 Controller | |
| 策略模式 | Resource 接口的不同实现 |
7. Spring Bean 的生命周期?
回答要点:
实例化 → 属性注入 → Aware接口回调 → BeanPostProcessor前置
→ InitializingBean/init-method → BeanPostProcessor后置
→ 使用 → DisposableBean/destroy-method → 销毁
@PostConstruct在 init-method 之前执行@PreDestroy在 destroy-method 之前执行
8. @Transactional 失效的场景?
回答要点:
- 同类方法调用:内部方法调用不走代理
- 非 public 方法:CGLIB 代理的限制
- 异常被吞掉:catch 后没有抛出
- 异常类型不对:默认只回滚 RuntimeException
- 数据库不支持:MyISAM 引擎不支持事务
四、消息队列
9. 你的项目为什么要用消息队列?
回答要点(结合实际场景):
- 异步解耦:下单后异步发短信/邮件,不阻塞主流程
- 削峰填谷:秒杀场景,请求先入队,后端按能力消费
- 数据同步:订单数据异步同步到 ES、数仓
- 实际案例:支付成功后通知发货、积分、优惠券等多个下游系统
10. 如何保证消息不丢失?
| 回答要点(以 RabbitMQ 为例): | 环节 | 保证方案 |
|---|---|---|
| 生产者 | confirm 机制确认消息到达 Broker | |
| Broker | 持久化(交换机+队列+消息) | |
| 消费者 | 手动 ACK,处理完再确认 |
五、Vue 前端实战
11. 大数据量表格卡顿怎么优化?
回答要点:
- 虚拟滚动:只渲染可视区域的行(vue-virtual-scroller / vxe-table)
- 分页加载:后端分页,前端懒加载
- 冻结列优化:减少固定列数量,用 CSS
position: sticky - 减少 watcher:大列表不要每行都双向绑定
- Web Worker:大数据计算放到 Worker 中
12. 首屏加载慢怎么优化?
回答要点:
- 打包优化:
- 路由懒加载
() => import('./xxx.vue') - 第三方库走 CDN(externals 配置)
- Tree Shaking + 代码分割
- 路由懒加载
- 资源优化:
- 图片压缩 + WebP 格式 + 懒加载
- Gzip / Brotli 压缩
- 渲染优化:
- 骨架屏 / Loading 状态
- 关键 CSS 内联
- 实测工具:Lighthouse、Performance 面板
13. 你遇到过哪些前端内存泄漏问题?
回答要点:
- 常见场景:
- 定时器未清除(setInterval 在 beforeUnmount 清除)
- 事件监听未移除(addEventListener 对应 removeEventListener)
- 闭包引用大对象
- 第三方库实例未销毁(ECharts、地图等)
- 排查方法:
- Chrome DevTools → Memory → Heap Snapshot
- 反复进入/离开页面,观察内存是否持续增长
14. 前端如何处理接口并发和防抖?
回答要点:
- 按钮防重复提交:
- 点击后 disable + loading 状态
- 接口层用 axios 拦截器取消重复请求
- 搜索防抖:
lodash.debounce300-500ms - 下拉加载节流:
lodash.throttle - 并发控制:Promise.all 或 p-limit 库控制并发数
六、后端实战进阶
15. 国内外不同区域数据如何同步?
回答要点:
-
方案选型: 方案 适用场景 延迟 数据库主从同步 读多写少,单向同步 秒级 双向同步(DTS/Canal) 多活架构 秒~分钟级 消息队列 最终一致性,解耦 秒级 应用层双写 定制化强 实时 - 核心问题处理:
- 冲突解决:时间戳优先、业务规则仲裁、人工处理
- 幂等设计:唯一键 + upsert
- 断网重连:本地日志 + 重试队列
- 实际经验:用阿里云 DTS 跨区同步,配合业务层对账
16. 高并发下如何保证库存不超卖?
回答要点:
- 数据库层:
UPDATE stock SET num = num - 1 WHERE goods_id = ? AND num > 0利用行锁 + 条件判断
- Redis 预扣减:
DECR原子操作,扣减成功再下单- Lua 脚本保证原子性
- 分布式锁(Redisson):控制并发入口
- 异步削峰:请求先入 MQ,顺序消费
17. 线上 OOM 怎么排查和处理?
回答要点:
- 紧急处理:
- 先扩容/重启止血
- 保留现场:
-XX:+HeapDumpOnOutOfMemoryError
- 排查步骤:
jmap -histo:live <pid>查看对象分布- MAT / VisualVM 分析 dump 文件
- 找到大对象 → 定位代码
- 常见原因:
- 大集合未释放、缓存无上限
- 批量查询不分页
- 线程池队列无界
18. 定时任务重复执行/漏执行怎么解决?
回答要点:
- 重复执行:
- 分布式锁(Redisson / 数据库锁)
- 任务状态标记(执行前检查)
- 用分布式调度框架(XXL-Job、Elastic-Job)
- 漏执行:
- 配置 misfire 策略(错过后立即补执行)
- 任务执行日志 + 对账告警
- 幂等设计:业务逻辑保证重复执行无副作用
七、项目与综合
19. 项目中遇到的最大挑战?
回答框架(STAR):
- 背景:什么业务场景
- 问题:遇到什么技术难点
- 方案:如何分析、如何解决
- 结果:带来什么收益(量化最好)
20. 分布式事务怎么处理?
回答要点:
- 最终一致性方案(推荐):
- 本地消息表 + MQ 重试
- 事务消息(RocketMQ)
- 强一致性方案:
- Seata AT 模式(对业务侵入小)
- 实际项目更多用最终一致性 + 对账补偿
21. 接口响应慢如何排查?
回答要点:
- 链路追踪:SkyWalking/Zipkin 定位慢在哪个环节
- 数据库:慢查询日志 + EXPLAIN 分析
- 代码层面:Arthas 火焰图分析热点方法
- 外部依赖:第三方接口超时、Redis 大 Key
- 常见优化:加索引、加缓存、异步化、批量处理
面试加分项
- 能结合实际项目经验回答
- 回答有条理(123 点)
- 知道方案的优缺点和适用场景
- 主动提及踩过的坑和解决过程