一、MySQL高频面试考点解析
1.1 索引优化与执行计划分析
在面试中,索引的设计与执行计划解读是必考内容。例如,当查询SELECT * FROM orders WHERE user_id=100 AND status='paid' ORDER BY create_time DESC时,需确保(user_id, status)复合索引存在,且覆盖排序字段create_time。可通过EXPLAIN SELECT ...查看执行计划,重点关注type列(如const、range、index)、key列(是否命中索引)及Extra列(是否出现Using filesort)。
优化建议:
- 避免索引列使用函数或计算,如
WHERE DATE(create_time)='2023-01-01'会导致索引失效。 - 覆盖索引可减少回表操作,例如为
SELECT user_id FROM orders WHERE status='paid'单独创建(status, user_id)索引。
1.2 事务隔离级别与锁机制
事务的隔离级别(读未提交、读已提交、可重复读、串行化)直接影响并发性能与数据一致性。例如,某电商场景中,用户同时下单与库存扣减需使用SELECT ... FOR UPDATE加行锁,防止超卖。
代码示例:
START TRANSACTION;SELECT stock FROM products WHERE id=100 FOR UPDATE; -- 加行锁UPDATE products SET stock=stock-1 WHERE id=100;COMMIT;
需注意死锁问题,可通过SHOW ENGINE INNODB STATUS分析死锁日志,优化顺序(如统一按ID升序操作)。
1.3 慢查询优化与分库分表
当单表数据量超过千万级时,需考虑分库分表。例如,按用户ID哈希分库,user_id % 4分配到4个库。面试中可能要求设计分片键选择策略,需避免热点数据(如按时间分片可能导致某月数据集中)。
工具推荐:
- 使用
pt-query-digest分析慢查询日志。 - 通过
SHOW STATUS LIKE 'Innodb_row_lock%'监控锁等待情况。
二、Linux系统操作核心技能
2.1 常用命令与进程管理
面试中常考察进程状态查看、资源占用分析等。例如,使用top -H -p <PID>查看线程级CPU占用,结合jstack <PID>分析Java线程堆栈。
关键命令:
ps -ef | grep java:查找Java进程。netstat -tulnp | grep 3306:检查MySQL端口监听。vmstat 1 5:监控系统内存、IO、CPU每秒变化。
2.2 Shell脚本编程与自动化
需掌握基础脚本编写,如批量处理日志文件。
示例脚本:统计Nginx日志中状态码为500的请求数:
#!/bin/bashLOG_FILE="/var/log/nginx/access.log"COUNT=$(awk '$9 == 500 {print $0}' $LOG_FILE | wc -l)echo "500错误请求数: $COUNT"
面试可能要求优化脚本性能,例如使用sed替代awk处理简单模式匹配。
2.3 性能监控与调优
需理解iostat、sar等工具输出。例如,iostat -x 1中%util接近100%表示磁盘IO饱和,可能需优化SQL或增加SSD。
调优思路:
- 调整
vm.swappiness减少Swap使用。 - 修改
/etc/security/limits.conf提高文件描述符限制。
三、综合场景题解析
3.1 高并发下单系统设计
面试可能要求设计一个支持每秒万级请求的下单系统。关键点包括:
- 数据库层:使用Redis预减库存,异步扣减MySQL。
- 缓存层:通过
SETNX实现分布式锁,防止重复下单。 - 异步处理:订单创建后通过消息队列(如Kafka)通知后续服务。
代码片段(Redis锁):
String lockKey = "order_lock_" + productId;try {while (true) {Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS);if (Boolean.TRUE.equals(locked)) {// 执行业务逻辑break;}Thread.sleep(100); // 短暂重试}} finally {redisTemplate.delete(lockKey);}
3.2 日志分析与故障排查
当系统报错“Too many connections”时,需快速定位问题。步骤如下:
- 使用
mysqladmin -u root -p status查看当前连接数。 - 执行
SHOW PROCESSLIST找出长时间运行的查询。 - 检查应用配置的连接池参数(如
maxActive是否过小)。
优化措施:
- 连接池配置
testWhileIdle=true定期检测空闲连接。 - 启用慢查询日志,设置
long_query_time=2秒。
四、备考建议与资源推荐
- 实战演练:在本地搭建MySQL与Linux环境,使用
sysbench模拟压测。 - 文档阅读:深入理解《MySQL技术内幕:InnoDB存储引擎》及Linux
man手册。 - 工具掌握:熟悉
Arthas(Java诊断)、Percona Toolkit(数据库工具集)。
通过系统梳理MySQL索引、事务、分库分表及Linux命令、脚本、监控等核心考点,结合实际场景与代码示例,可有效提升面试通过率。建议每日练习1-2道典型题,并总结解题思路,形成知识体系。