文章目录
一、事务相关(必考!)
1. 什么是ACID特性?
(这里超级重要)ACID是事务的四大特性:
- 原子性(Atomicity):要么全成功,要么全失败!(比如转账时A扣钱B没收到?绝对不行!)
- 一致性(Consistency):数据必须符合所有约束(就像转账前后总金额必须一致)
- 隔离性(Isolation):多个事务并发时要隔离(后面会详细讲隔离级别)
- 持久性(Durability):提交后数据永久保存(断电也不怕)
2. 事务隔离级别有哪些?
(面试官最爱追问的问题)从低到高分为:
- 读未提交(Read Uncommitted):能读到别人没提交的数据(容易脏读)
- 读已提交(Read Committed):只能读到已提交数据(Oracle默认)
- 可重复读(Repeatable Read):同一事务多次读取结果一致(MySQL默认)
- 串行化(Serializable):完全隔离(性能最差)
举个栗子🌰:小明转账时,小红查余额看到中间状态就是脏读!(用读未提交会出现这种情况)
二、索引优化(重点!)
3. B+树索引为什么比B树好?
(数据结构必考题)主要三点优势:
- 非叶子节点只存键值,能放更多数据(减少IO次数)
- 叶子节点形成有序链表(范围查询超快)
- 所有数据都存在叶子节点(查询稳定性好)
4. 聚簇索引 vs 非聚簇索引
(很多人分不清的概念)
- 聚簇索引:数据按索引顺序存储(比如InnoDB的主键索引)
- 非聚簇索引:索引和数据分离(像MyISAM的索引)
划重点👉:一个表只能有一个聚簇索引!
5. 什么情况索引会失效?
(实际开发中经常踩坑)
- 使用
!=
或<>
操作符 - 对字段进行函数操作(如
YEAR(create_time)=2023
) - 类型转换(比如字符串字段传了数字)
- 最左前缀原则失效(复合索引没按顺序用)
LIKE
以通配符开头(%abc
)
三、锁机制(进阶必备)
6. 共享锁和排他锁区别
- 共享锁(S锁):读锁,其他事务可以加S锁但不能加X锁
- 排他锁(X锁):写锁,其他事务不能加任何锁
口诀:读读不冲突,读写/写写都冲突!
7. 死锁如何产生?怎么解决?
(生产环境常见问题)
产生条件:
- 互斥访问
- 持有并等待
- 不可剥夺
- 循环等待
解决方案:
- 设置超时时间(innodb_lock_wait_timeout)
- 死锁检测(innodb_deadlock_detect)
- 保持事务短小精悍
- 按固定顺序访问资源
四、SQL优化技巧(实战重点)
8. EXPLAIN关键字怎么看?
(调优必备技能)重点关注:
- type:访问类型(最好到ref/eq_ref)
- key:实际使用的索引
- rows:预估扫描行数
- Extra:Using filesort/Using temporary要警惕!
9. 分库分表常用方案
(高并发场景必问)
- 垂直拆分:按业务拆分(用户表、订单表分开)
- 水平拆分:按数据分片(比如用户ID取模)
- 时间分表:按月/年分表(适合日志类数据)
注意⚠️:分库分表后要解决分布式事务问题!
五、其他高频问题
10. varchar和char的区别?
(看似简单实则暗藏玄机)
- char:定长,适合存储固定长度数据(如手机号)
- varchar:变长,适合长度变化大的数据(如地址)
关键点:varchar需要1-2字节存储长度信息,char会自动补空格!
附:三范式简单版
- 第一范式(1NF):属性不可再分
- 第二范式(2NF):消除部分依赖
- 第三范式(3NF):消除传递依赖
(实际开发中不必严格遵循,根据业务灵活处理)
六、写在最后
建议大家在理解这些概念后,一定要动手实践!比如:
- 用EXPLAIN分析自己的SQL
- 故意制造死锁观察现象
- 对比不同索引的查询效率
记住:数据库知识光背理论是不够的,要结合实际问题去理解。如果遇到不确定的问题,可以直接说"这个我需要查下文档确认",诚实比瞎蒙更靠谱哦~(完)