侧边栏壁纸
博主头像
ZOUXS的空间博主等级

人生苦短,我学python

  • 累计撰写 23 篇文章
  • 累计创建 24 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

MySQL 超级知识点

zouxs
2026-05-22 / 0 评论 / 0 点赞 / 6 阅读 / 7460 字
温馨提示:
本文最后更新于 2026-05-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

目录(点击跳转)

  1. 事务 ACID
  2. MVCC 多版本并发控制
  3. 索引失效 10 种场景
  4. 锁机制与死锁
  5. 慢查询优化完整流程
  6. MySQL 高频面试扩展知识点

1. 事务 ACID

1.1 原子性(Atomicity)

  • 含义:事务要么全部成功,要么全部失败回滚,不可分割
  • 实现:undo log 回滚日志
  • 作用:保证异常情况下可以撤销操作,回到执行前状态
  • 面试要点:原子性保证的是“操作要么全做,要么全不做”

1.2 一致性(Consistency)

  • 含义:事务执行前后,数据完整性约束不被破坏
  • 实现:主键、外键、唯一约束、触发器、事务锁
  • 作用:保证数据合法、业务逻辑正确
  • 面试要点:一致性是最终目标,ACID 都是为了保证一致性

1.3 隔离性(Isolation)

  • 含义:多个事务并发执行时,互相不可见、不干扰
  • 实现:锁机制 + MVCC
  • 作用:解决脏读、不可重复读、幻读
  • 面试要点:隔离性越高,并发性能越低,需要平衡

1.4 持久性(Durability)

  • 含义:事务一旦提交,数据永久保存,宕机不丢失
  • 实现:redo log 重做日志
  • 作用:MySQL 重启后可通过 redo log 恢复已提交数据
  • 面试要点:先写 redo log,再写磁盘,保证不丢数据

1.5 面试必背总结

  • 原子性:undo log
  • 持久性:redo log
  • 隔离性:锁 + MVCC
  • 一致性:最终目的

2. MVCC 多版本并发控制

2.1 什么是 MVCC

  • 多版本并发控制,InnoDB 核心机制
  • 读写不阻塞、读读不阻塞、写写互斥
  • 大幅提升并发性能

2.2 核心依赖

  1. undo log:保存历史版本数据
  2. ReadView:事务快照,决定可见哪个版本

2.3 解决了什么问题

  • 脏读
  • 不可重复读
  • 部分解决幻读(InnoDB 可重复读级别下)

2.4 工作原理

  • 每条数据隐藏两个字段:
    • trx_id:生成此版本的事务ID
    • roll_pointer:指向历史版本(undo log)
  • 事务启动时生成 ReadView,判断数据是否可见

2.5 面试必背

  • MVCC 只在 RC(读已提交)、RR(可重复读) 两个隔离级别生效
  • 实现“无锁读”,高并发必备
  • 是 MySQL InnoDB 高并发核心

3. 索引失效 10 种场景

3.1 左模糊 %xxx

  • where name like '%测试' → 失效
  • 右模糊可走索引:like '测试%'

3.2 字段使用函数/运算

  • where DATE(create_time) = '2025-05-20'
  • where age + 1 = 18
  • 索引失效,全表扫描

3.3 隐式类型转换

  • 字段是 varchar,查询传数字
  • where phone = 13800138000 → 失效
  • 必须加引号:'13800138000'

3.4 联合索引不满足最左前缀

  • 索引 (a,b,c)
  • 查询 where b=? and c=? → 索引失效
  • 必须包含左侧列 a

3.5 OR 含非索引列

  • OR 前后必须都有索引,否则整个失效
  • where a=1 or b=2,b 无索引 → 失效

3.6 != / not in / is not null

  • 这些语法几乎一定不走索引
  • 优化:用范围、正向条件替代

3.7 数据分布不均

  • 数据重复度太高(如性别、状态)
  • 优化器认为全表扫描更快,放弃索引

3.8 join 字段类型不一致

  • A 表 int,B 表 varchar
  • 索引失效,关联极慢

3.9 order by 混乱

  • order by 字段与索引顺序不一致
  • 出现 filesort,性能差

3.10 统计信息过期

  • 表数据变化大,统计信息不准
  • 优化器选错索引
  • 解决:analyze table 表名

4. 锁机制

4.1 InnoDB 锁类型

  1. 表锁:锁全表,并发低
  2. 行锁:锁单行,并发高(InnoDB 默认)
  3. 间隙锁:锁范围,防止插入
  4. 临键锁:行锁+间隙锁,默认隔离级别下的锁

4.2 死锁四大条件(必须同时满足)

  1. 互斥
  2. 请求与保持
  3. 不可剥夺
  4. 循环等待
  • 破坏任意一个即可避免死锁

4.3 死锁排查

  • 命令:show engine innodb status
  • 查看 LATEST DETECTED DEADLOCK 段落
  • 查看锁等待、事务、SQL

4.4 死锁解决策略

  • 按固定顺序加锁
  • 事务保持短小
  • 设置锁等待超时
  • 开启死锁检测(默认开启)
  • 避免长事务、大事务

5. 慢查询优化

5.1 开启慢查询日志

slow_query_log = 1
long_query_time = 2 # 超过 2 秒记录
log_queries_not_using_indexes = 1

5.2 分析慢查询

  • 工具:mysqldumpslow
  • 按次数、时间、锁定时间排序

5.3 explain 执行计划(核心)

重点看4列:

  • type:最好是 const → ref → range → all
  • key:实际使用索引
  • rows:扫描行数越少越好
  • Extra:不要出现 Using filesort / Using temporary

5.4 优化手段

  1. 建立合适索引
  2. 优化 SQL 语句
  3. 减少联表、子查询
  4. 优化分页(大分页用延迟关联)
  5. 大表分库分表

6. MySQL 高频面试扩展知识点

6.1 事务隔离级别

  1. 读未提交 RU
  2. 读已提交 RC(互联网常用)
  3. 可重复读 RR(MySQL 默认)
  4. 串行化 Serializable

6.2 三大日志

  • undo log:保证原子性、MVCC
  • redo log:保证持久性
  • binlog:数据备份、主从同步

6.3 索引结构

  • InnoDB:B+ 树
  • 叶子节点存整行数据(聚簇索引)
  • 非叶子节点只存键值

6.4 聚簇索引 vs 二级索引

  • 聚簇索引:主键索引,整行数据
  • 二级索引:叶子节点存主键,需回表

6.5 大分页优化

  • limit 100000,20 极慢
  • 优化:延迟关联、主键过滤、覆盖索引

6.6 面试必背总结

  • 高并发靠 MVCC + 行锁
  • 快查询靠 正确索引 + 良好SQL
  • 事务安全靠 ACID + 日志机制

相关链接

0

评论区