文章目录
- 一、事务篇(必考重点)
- 1.1 事务四大特性(ACID)
- 1.2 事务实战技巧
- 二、索引优化大法
- 2.1 索引类型全家福
- 2.2 EXPLAIN命令实战
- 三、存储引擎选型指南
- 3.1 InnoDB vs MyISAM 终极对决
- 四、SQL优化实战手册
- 4.1 慢查询七宗罪
- 4.2 分页优化黑科技
- 五、锁机制深度解析
- 5.1 锁类型大全
- 六、高频灵魂拷问
- Q:CHAR和VARCHAR的区别?
- Q:为什么推荐自增主键?
- Q:大表ALTER操作卡死怎么办?
- 七、性能优化三板斧
- 八、最新趋势观察
- 实战建议
一、事务篇(必考重点)
1.1 事务四大特性(ACID)
这个知识点简直是面试官的「必杀技」(划重点)!!!四个字母分别代表:
- 原子性(Atomicity):事务要么全成功,要么全失败,不存在中间态(就像转账要么成功要么失败)
- 一致性(Consistency):数据在事务前后必须合法(比如账户余额不能为负数)
- 隔离性(Isolation):多个事务并发执行互不干扰
- 持久性(Durability):事务提交后数据永久保存
(超级重要)面试官最爱追问隔离级别问题!记住这四个级别:
- 读未提交(可能读到脏数据)
- 读已提交(Oracle默认)
- 可重复读(MySQL默认)
- 串行化(性能最差)
1.2 事务实战技巧
-- 典型的事务代码结构
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT; -- 或 ROLLBACK
(踩坑警告)忘记设置隔离级别导致幻读问题,是新手常见错误!
二、索引优化大法
2.1 索引类型全家福
- B+Tree索引(默认选手)
- 哈希索引(精准匹配快但范围查询跪)
- 全文索引(文本搜索专用)
- 空间索引(GIS数据处理)
(血泪教训)索引不是越多越好!每个额外索引都会:
- 增加存储空间
- 降低写操作速度
- 可能导致优化器选择错误执行计划
2.2 EXPLAIN命令实战
EXPLAIN SELECT * FROM users WHERE age > 18;
关键指标三剑客:
- type列:ALL(全表扫描)→ index → range → ref → const
- key列:实际使用的索引
- rows列:预估扫描行数
(性能杀手预警)看到Using filesort或Using temporary赶紧优化!
三、存储引擎选型指南
3.1 InnoDB vs MyISAM 终极对决
特性 | InnoDB | MyISAM |
---|---|---|
事务支持 | ✅ | ❌ |
行级锁 | ✅ | 表级锁 |
外键 | ✅ | ❌ |
崩溃恢复 | 强 | 弱 |
全文索引 | ✅(5.6+) | ✅ |
(2023最新趋势)现在默认都用InnoDB!MyISAM只适合读多写少的日志表
四、SQL优化实战手册
4.1 慢查询七宗罪
SELECT *
全字段查询- 滥用子查询
- 函数处理索引字段
- 类型转换导致索引失效
- OR条件使用不当
- 联合索引顺序错误
- LIMIT分页深度过大
4.2 分页优化黑科技
传统分页:
SELECT * FROM table LIMIT 1000000, 10; -- 性能暴击!
优化方案:
SELECT * FROM table
WHERE id > 上一页最后ID
ORDER BY id
LIMIT 10;
五、锁机制深度解析
5.1 锁类型大全
- 共享锁(S锁):
SELECT ... LOCK IN SHARE MODE
- 排他锁(X锁):
SELECT ... FOR UPDATE
- 意向锁:解决行锁与表锁冲突
- 记录锁:锁定单行记录
- 间隙锁:解决幻读问题
- 临键锁:记录锁+间隙锁组合
(死锁现场)两个事务互相等待对方释放锁时就会触发!可以通过SHOW ENGINE INNODB STATUS
查看死锁日志
六、高频灵魂拷问
Q:CHAR和VARCHAR的区别?
A:CHAR定长(适合存储固定长度如身份证号),VARCHAR变长(适合长度变化大的数据)。CHAR末尾空格会被去除,VARCHAR会保留
Q:为什么推荐自增主键?
A:① 插入性能高 ② 减少页分裂 ③ 缓存友好 ④ 避免业务耦合
Q:大表ALTER操作卡死怎么办?
A:推荐使用pt-online-schema-change工具实现不停机修改表结构
七、性能优化三板斧
- 架构层:读写分离+分库分表
- SQL层:慢查询优化+索引优化
- 配置层:调整innodb_buffer_pool_size(建议设置物理内存的70%)
(监控必备)安装Percona Monitoring and Management(PMM),实时监控数据库健康状态
八、最新趋势观察
MySQL 8.0重磅更新:
- 窗口函数(分析函数爽到飞起)
- 通用表表达式CTE(SQL可读性飙升)
- 隐藏索引(测试索引不影响生产)
- 原子DDL(再也不怕alter中途崩溃)
- JSON增强(支持->>操作符)
实战建议
纸上得来终觉浅,绝知此事要躬行!推荐自己搭建MySQL环境,尝试:
- 用sysbench做压力测试
- 故意制造死锁分析日志
- 体验不同隔离级别下的并发问题
- 用pt-query-digest分析慢查询日志
(终极提醒)面试前务必亲手写过JOIN查询、子查询、事务代码,理论+实践=offer到手!