文章目录
🔥 写在前面:为什么优化是面试官的灵魂拷问?
各位正在备战面试的勇士们!(敲黑板)MySQL优化绝对是技术面中的"死亡问答区"!我亲眼见过太多候选人被连环追问到冒冷汗的场景。但别慌!今天我们就来拆解那些让面试官眼前一亮的优化绝招,记得看到最后的"死亡案例剖析"!(真实血泪教训)
一、索引优化的三大神技(必考知识点)
1.1 B+树原理的降维打击
“为什么用B+树不用二叉树?”——这个问题直接暴露知识深度!
✅ 黄金回答模板:
“因为B+树的非叶子节点只存索引(相当于目录页),能存储更多键值。叶子节点形成有序链表(范围查询超快),而且数据都存储在叶子节点(查询稳定性更高)。举个🌰:百万数据查询,二叉树可能要20次IO,B+树只要3-4次!”
1.2 最左前缀法则的骚操作
创建了联合索引却用不上?90%的新手都踩过这个坑!
-- 创建联合索引
ALTER TABLE users ADD INDEX idx_name_age(name, age);
-- ✅ 走索引的姿势
SELECT * FROM users WHERE name = '老王' AND age > 30;
SELECT * FROM users WHERE name LIKE '张%';
-- ❌ 翻车现场
SELECT * FROM users WHERE age = 25; -- 最左列缺失
SELECT * FROM users WHERE name LIKE '%小明'; -- 左模糊
1.3 覆盖索引的秒杀技
遇到分页查询卡成狗?试试这个黑魔法!
-- 传统写法(性能暴毙)
SELECT * FROM orders ORDER BY create_time DESC LIMIT 100000, 10;
-- 优化版(速度提升100倍!)
SELECT * FROM orders
INNER JOIN (
SELECT id FROM orders
ORDER BY create_time DESC
LIMIT 100000, 10
) AS tmp USING(id);
二、慢查询分析的核武器库
2.1 EXPLAIN结果精读(附破解密码)
重点盯防三个杀手:
- type列:ALL全表扫描直接判死刑!
- key_len:数值越大索引利用率越高
- Extra:出现"Using filesort"或"Using temporary"立即报警!
2.2 死锁排查的福尔摩斯指南
遇到死锁不要慌,三步定位快准狠:
- 开启监控:
SHOW ENGINE INNODB STATUS
- 查看最近死锁:
SELECT * FROM information_schema.INNODB_TRX
- 分析锁等待:
SELECT * FROM performance_schema.data_locks
三、分库分表的九阴真经
3.1 拆库拆表的选择困难症
✅ 黄金定律:
- 单表超2000万行考虑拆分
- 优先垂直分(业务维度)
- 其次水平分(数据维度)
3.2 拆后查询的乾坤大挪移
跨库分页查询的经典解法:
-- 原始语句(跨库爆炸)
SELECT * FROM orders ORDER BY time DESC LIMIT 1000000,20;
-- 优化方案(两次查询法)
1. 查询各分片前1000020条
2. 内存中合并排序
3. 取最后20条
四、高频死亡考题解析(血泪教训)
Q1:“为什么不要用SELECT *?”
💣 错误答案:“因为查询所有字段慢”
💎 满分答案:
- 无法使用覆盖索引
- 增加网络传输开销
- 表结构变更可能导致应用异常
- 内存临时表容易溢出
Q2:“COUNT(*)和COUNT(1)哪个快?”
💣 错误答案:“COUNT(1)快”
💎 真相时刻:在MySQL 5.7+版本中,两者性能完全一致!但COUNT(列名)会有差异
Q3:“线上遇到CPU飙升怎么排查?”
🚑 急救三部曲:
SHOW PROCESSLIST
抓现行EXPLAIN
分析慢查询pt-query-digest
解析慢日志
五、实战案例分析:千万级订单表优化记
5.1 原始情况
- 表结构:23个字段,包含5个text字段
- 数据量:1.2亿条
- 痛点:统计报表查询超时,写入频繁卡顿
5.2 优化三板斧
- 冷热分离:把历史订单归档到ClickHouse
- 字段优化:拆分大字段到扩展表
- 读写分离:用ProxySQL做流量分发
5.3 效果对比
指标 | 优化前 | 优化后 |
---|---|---|
查询耗时 | 8.2s | 0.3s |
写入TPS | 120 | 850 |
磁盘空间 | 1.2T | 320G |
🚀 最后的大招:优化思维导图
记住:优化没有银弹!一定要结合业务场景,先测量再优化。那些张口就来的"优化建议",往往都是性能毒药!(别问我怎么知道的…)
下次面试被问到MySQL优化,记得把这篇秘籍在脑子里过一遍。祝各位攻城狮面试顺利,offer拿到手软!💪