文章目录
一、数据库必知的三大核心概念(划重点)
1. 事务的四大金刚——ACID特性
- 原子性(Atomicity):要成功全成功,要失败全回滚!转账时一方扣款失败,另一方绝对不能到账
- 一致性(Consistency):数据状态必须合法(比如账户余额不能为负数)
- 隔离性(Isolation):多个事务并发时互不干扰(重要考点后面细说!)
- 持久性(Durability):提交后数据永久保存,断电都不丢
2. 索引的七十二变
- B+树索引(默认选手):适合范围查询,叶子节点形成链表
- 哈希索引(闪电侠):等值查询快如闪电,但范围查询直接扑街
- 全文索引(文档专家):处理文本搜索的隐藏大佬
- 组合索引(排列组合大师):最左匹配原则必须记牢!(比如index(a,b,c) 能用a、a,b、a,b,c查询)
3. 锁的江湖恩怨
- 行级锁 vs 表级锁:InnoDB的行锁才是现代数据库的标配
- 共享锁(S锁):读锁,允许其他读不许写
- 排他锁(X锁):写锁,谁都不许碰
- 死锁检测:数据库会自动回滚代价小的事务(别以为死锁是程序员的锅!)
二、面试官最爱的五个灵魂拷问
1. 为什么索引能加速查询?
根本原因是B+树的三层结构:假设千万级数据,3层B+树只需3次IO(普通二叉树可能需要20+次)。叶子节点存储实际数据+指针,非叶节点只存索引值,就像图书馆的目录索引!
2. 事务隔离级别怎么选?
- 读未提交(会看到别人没提交的数据)→ 脏读警告!
- 读已提交(Oracle默认)→ 解决脏读但可能有不可重复读
- 可重复读(MySQL默认)→ 用MVCC实现快照读
- 串行化(性能杀手)→ 直接加锁排队
3. EXPLAIN结果怎么看?
重点看type列:
- const:通过主键访问
- ref:普通索引查询
- range:范围扫描
- index:全索引扫描
- ALL(危险!):全表扫描
4. 三大日志文件作用对比
- redo log(重做日志):保证事务持久性,物理日志
- undo log(回滚日志):保证事务原子性,逻辑日志
- binlog(归档日志):主从复制和恢复,逻辑日志
5. 分库分表何时出手?
当单表数据超过500万行(经验值)或硬件性能瓶颈时。常用方案:
- 水平分片:按用户ID取模分表
- 垂直拆分:把大字段拆分到单独表
- 中间件方案:ShardingSphere、MyCat等
三、实战中的翻车现场
1. 隐式类型转换惨案
SELECT * FROM users WHERE phone=13812345678; -- phone字段是varchar类型
这个查询会导致全表扫描!因为数字13812345678会被转换成字符串,无法使用索引。
2. 索引失效的六大陷阱
- 对索引列做计算:WHERE YEAR(create_time)=2023
- 使用前导通配符:WHERE name LIKE ‘%张%’
- 类型不一致:WHERE id=‘123’(id是int类型)
- 使用OR连接:WHERE a=1 OR b=2
- 违反最左前缀:组合索引(a,b,c)但查询条件只有b
- 数据区分度过低:性别字段建索引基本没用
3. JOIN操作的性能黑洞
- 小表驱动大表原则:永远让结果集小的表当驱动表
- 避免SELECT *:只取需要的列
- 用好覆盖索引:索引包含所有查询字段
四、高频考点脑图(重点记忆)
MySQL知识体系
├─ 存储引擎
│ ├─ InnoDB(默认):支持事务、行锁、外键
│ └─ MyISAM:全文索引、表锁、计数更快
├─ 索引优化
│ ├─ EXPLAIN分析
│ ├─ 索引失效场景
│ └─ 最左前缀原则
├─ 事务机制
│ ├─ ACID特性
│ ├─ 隔离级别
│ └─ MVCC实现
└─ 高可用方案
├─ 主从复制
├─ 读写分离
└─ 分库分表
五、面试加分的骚操作
1. 死锁分析姿势
遇到死锁不要慌,用命令:
SHOW ENGINE INNODB STATUS;
在输出的LATEST DETECTED DEADLOCK部分可以看到详细的死锁信息,包括涉及的事务和SQL语句。
2. 冷门但好用的函数
- GROUP_CONCAT():行转列神器
- WINDOW函数(MySQL8+):RANK()、ROW_NUMBER()
- JSON_EXTRACT():处理JSON字段
3. 性能优化杀手锏
- 批量插入:用INSERT INTO … VALUES (),(),() 代替多次单条插入
- 延迟关联:先查ID再取数据,应对深度分页
- 强制索引:SELECT * FROM table FORCE INDEX(index_name)
六、备考建议(来自面霸的血泪史)
- 理解原理比死记命令重要(面试官最爱问为什么)
- 准备2-3个实际优化案例(比如把查询从2s优化到0.1s)
- 关注MySQL8.0新特性(窗口函数、原子DDL等)
- 动手实验比看文档有效(自己故意制造慢查询然后优化)
- 了解常见中间件(比如分库分表怎么实现)
最后提醒:面试时被问到不会的问题,可以说"这个知识点我需要查证一下,我目前的思路是…",千万不要不懂装懂!MySQL水很深,诚实有时比正确更重要(当然能答对最好)!