一、MySQL 面试题(25题)
1. 索引为什么用 B+树?
-
有序、范围查询快
-
多叉树,IO 次数少
-
叶子节点链表,遍历快

2. 最左前缀原则?
联合索引必须**从左到右依次匹配**,跳过左边列会失效。
3. 覆盖索引?
查询的字段**都在索引里**,不需要回表。
4. 回表是什么?
通过二级索引查到主键,再去查聚簇索引。
5. ACID?
-
原子性:要么全成功,要么全失败
-
一致性:数据合法
-
隔离性:事务互不干扰
-
持久性:提交后永久保存
6. 四大隔离级别
-
读未提交:脏读
-
读已提交(RC):解决脏读
-
可重复读(RR):解决不可重复读
-
串行化:无并发,最安全
7. 脏读、不可重复读、幻读
-
脏读:读到未提交数据
-
不可重复读:同一事务两次读不一样
-
幻读:范围查询出现新行
8. InnoDB 锁
-
行锁:锁一行,并发高
-
表锁:锁全表,并发低
-
间隙锁:防止幻读
9. 死锁怎么产生?
两个事务互相持有对方需要的锁,循环等待。
10. 死锁解决
-
保证锁顺序一致
-
小事务
-
设置超时
-
查看死锁日志
11. 慢查询怎么定位?
-
慢查询日志
-
show processlist
-
explain
12. explain 看什么?
-
type:最好是 ref、range、const
-
key:是否走索引
-
rows:扫描行数
-
Extra:不要出现 Using filesort / Using temporary
13. 大分页 limit 100000,20 怎么优化?
-
改为主键游标分页
-
用延迟关联
14. MySQL 为什么有时候不选索引?
-
数据分布不均匀
-
区分度低
-
优化器判断全表更快
15. 大表优化方案?
-
索引优化
-
分表(按时间/用户)
-
冷热分离
-
读写分离
16. 主键自增 vs UUID?
-
自增:顺序、性能高
-
UUID:无序、页分裂、性能差
17. varchar(50) 存中文占多少?
utf8mb4 一个字符 3~4字节,长度是字符数。
18. char 和 varchar 区别?
-
char:固定长度,速度快
-
varchar:变长,省空间
19. 为什么不建议用 select *?
-
不用覆盖索引
-
回表
-
网络IO大
20. 联合索引怎么建?
-
等值放前面
-
范围放后面
-
高频查询字段放前面
21. MySQL 主从复制原理?
-
主库 binlog
-
从库 IO 线程拉取
-
SQL 线程重放
22. 主从延迟怎么办?
-
业务读主
-
减少大事务
-
分库
23. 事务什么时候会失效?
-
自动提交开着
-
引擎不支持(MyISAM)
-
混合引擎
24. 什么是 MVCC?
多版本并发控制,通过 undo log 实现无锁读。
25. MySQL 优化三句话
-
索引要建好
-
事务要短小
-
查询要简单
二、Redis 面试题(20题)
1. Redis 为什么快?
-
内存操作
-
单线程避免切换
-
IO 多路复用
-
高效结构
2. 5 种数据结构
-
String:缓存、计数器
-
Hash:对象
-
List:队列
-
Set:去重
-
ZSet:排行榜
3. 缓存雪崩?
大量 key 同时过期,流量打 DB。
解决:随机过期、集群、降级、预热。
4. 缓存击穿?
热点 key 过期,大量请求打 DB。
解决:分布式锁、永不过期。
5. 缓存穿透?
查不存在的数据,绕过缓存。
解决:空值缓存、布隆过滤器。
6. 分布式锁实现?
SET key value NX EX 过期 + Lua 保证原子。
7. 分布式锁注意点?
-
防死锁(加过期)
-
防误删(只能删自己的)
-
原子操作
8. 缓存一致性?
先更新 DB,再删缓存。
9. Redis 持久化?
-
RDB:快照,快,可能丢数据
-
AOF:日志,安全,文件大
10. 内存淘汰策略?
-
LRU:最少使用
-
LFU:最少频率使用
-
random 随机
-
noeviction 不淘汰
11. 缓存预热?
启动时把热点数据加载进 Redis。
12. 缓存降级?
缓存挂了,直接返回兜底数据。
13. Redis 单线程为什么还快?
纯内存 + IO 多路复用。
14. Redis 集群模式?
主从、哨兵、Cluster。
15. 主从作用?
读写分离、容灾。
16. 哨兵作用?
自动故障转移。
17. Redis 大 Key 危害?
-
阻塞主线程
-
网络卡顿
-
迁移慢
18. 怎么处理大 Key?
拆分、压缩、分批。
19. Redis 并发竞争问题?
分布式锁、Lua 原子操作。
20. Redis 与 Memcached 区别?
- Redis 支持更多结构、持久化、集群、事务。
三、高并发 / 分布式(20题)
1. 高并发怎么保证稳定?
限流 → 熔断降级 → 异步 → 缓存 → DB 优化 → 监控扩容。
2. 限流算法?
-
令牌桶:允许突发
-
漏桶:匀速
3. 熔断?
调用失败率高,暂时停止调用。
4. 降级?
关掉非核心,保核心。
5. 接口幂等?
重复调用结果一样。
实现:唯一号、状态机、去重表。
6. 分布式 ID?
UUID、雪花算法、号段模式。
7. 分布式事务?
2PC、TCC、可靠消息最终一致。
8. 如何防止超卖?
DB 行锁、Redis 预扣、分布式锁。
9. 如何设计高并发接口?
-
缓存
-
异步
-
分库分表
-
限流
-
无状态
10. 接口超时排查?
日志 → 网络 → Redis → DB → MQ → 机器负载。
11. 如何避免重复提交?
token 机制、Redis 防重。
12. 什么是 RPC?
远程过程调用,像调用本地一样调用服务。
13. 什么是微服务?
按业务拆小服务,独立部署。
14. 微服务优缺点?
优点:扩缩容、迭代快
缺点:分布式问题多
15. 服务雪崩?
一个服务挂了,调用方也挂,级联失败。
解决:熔断、隔离、限流。
16. 如何设计秒杀?
-
前端限流
-
后端排队
-
Redis 预扣
-
异步下单
-
兜底
17. 什么是最终一致性?
不实时一致,但最终一致。
18. 什么是柔性事务?
不强一致,保证最终一致。
19. 如何做灰度发布?
按用户、IP、机器比例放量。
20. 高可用设计三要素?
无状态、集群、自动故障转移。
四、MQ 消息队列(10题)
1. MQ 作用?
异步、解耦、削峰。
2. 消息丢失?
生产者确认 + 持久化 + 手动 ACK。
3. 消息重复?
幂等:唯一ID去重。
4. 消息堆积?
扩容消费者、优化消费、死信队列。
5. 死信队列?
消费失败、过期、超过次数 → 进入死信。
6. 延时队列?
定时任务、关单、超时提醒。
7. MQ 集群?
高可用,避免单点。
8. 消息顺序?
保证同一队列只有一个消费者。
9. 推拉模式?
推:实时
拉:可控
10. RabbitMQ/Kafka 区别?
-
Rabbit:可靠、事务、延迟
-
Kafka:高吞吐、日志
五、计算机基础(15题)
1. HTTP 与 HTTPS
HTTPS 加密、身份认证、防篡改。
2. TCP 三次握手
建立可靠连接。
3. TCP 四次挥手
断开连接。
4. Cookie vs Session
Cookie 存在客户端,Session 服务端。
5. JWT
无状态、自包含、适合分布式。
6. Get vs Post
Get 幂等、查询;Post 非幂等、提交。
7. 状态码
200成功、302重定向、400参数、401未登录、403权限、404不存在、500服务错。
8. 线程 vs 进程
进程是资源单位,线程是执行单位。
9. 死锁条件?
互斥、请求保持、不可剥夺、循环等待。
10. 内存溢出?
内存不够用,对象无法回收。
11. IO 多路复用?
一个线程处理多个连接。
12. 同步 vs 异步
同步等结果,异步不等。
13. 阻塞 vs 非阻塞
阻塞等,非阻塞立刻返回。
14. 什么是序列化?
对象转字节流,方便传输。
15. 什么是反射?
运行时获取类信息、调用方法。
六、场景题(10题)
1. 线上 CPU 100%?
-
top 找到进程
-
定位线程
-
看栈、看循环、看GC
2. 接口突然慢?
日志 → Redis → DB慢查询 → MQ堆积 → 网络 → 机器。
3. 设计订单系统?
-
分布式ID
-
幂等
-
事务/锁
-
异步通知
-
分表
4. 设计支付系统?
-
验签
-
幂等
-
事务
-
对账
-
安全
5. 如何保证数据安全?
加密、脱敏、权限、审计、防SQL注入/XSS。
6. 如何做权限系统?
RBAC:用户-角色-权限。
7. 如何做监控?
接口耗时、错误率、CPU、内存、连接数、慢查询、缓存命中率。
8. 如何做容灾?
多机房、集群、自动切换、备份。
9. 如何做全链路压测?
模拟流量、监控、调优。
10. 你最难的问题?
高并发锁等待、超时、一致性。
用:索引 + 分布式锁 + MQ + 限流熔断解决。