一、存储引擎(只重点 InnoDB)

  1. MySQL 5.5 以后默认引擎是 InnoDB,也是现代企业项目唯一使用的引擎。
  2. InnoDB 特点:
    • 支持 事务
    • 支持 行级锁,并发性能好
    • 支持 外键(实际开发基本不用)
    • 基于 B+ 树索引结构
    • 依靠 MVCC 实现无锁并发读写
  3. MyISAM 不支持事务和行锁,并发差,已基本淘汰。
  4. InnoDB引擎中事务原理:redo log 重做日志,记录做了什么修改,实现事务的持久性WAL(write-ahead-logging):先写日志再写磁盘,事务提交只需写redo log(顺序IO,极快),在刷盘时出现错误可进行数据恢复
  5. undo log回滚日志,记录数据被修改前的信息,当执行回滚时,可以从undo log中的逻辑记录读取相应的内容并进行回滚,保证原子性
  6. 开始事务 【1】生成 Undo Log(保存旧数据,用来回滚)  【2】修改内存中的数据页(还没写磁盘) 【3】写入 Redo Log(WAL 原则:先写日志)    【4】提交事务(commit)    【5】后台慢慢把内存数据刷到磁盘(随机IO)

二、索引(重中之重)

  1. 索引是提高查询效率的数据结构,InnoDB 使用 B+ 树
  2. 常见索引类型:
    • 主键索引(PRIMARY KEY)
    • 普通索引(INDEX)
    • 唯一索引(UNIQUE)
    • 联合索引(多字段组合)
  3. 最左前缀原则
    • 联合索引 (a,b,c),能命中:aa,ba,b,c
    • 跳过前面字段,无法命中整个索引
  4. 索引失效常见场景:
    • where字段使用函数、运算
    • 模糊查询 %前缀,前缀不能模糊
    • 类型隐式转换,字符串要加' '
    • 全表扫描比索引更快时,优化器会放弃索引
    • or连接有一个字段没索引
    • 违反最左前缀原则

三、EXPLAIN 执行计划

  1. 用于查看 MySQL 如何执行 SQL,是否使用索引。
  2. 重点看这几列:
    • type:索引查询效率,system > const > ref > range > index > ALL
      • 至少要达到 range / ref,ALL 代表全表扫描,需要优化
    • key:实际命中的索引
    • rows:扫描行数,越小越好
    • Extra:额外信息,如 Using indexUsing filesort
  3. 作用:
    • 判断 SQL 是否走索引
    • 定位慢查询原因
    • 优化联合索引、查询语句

四、事务与 ACID

  1. 事务是一组不可分割的 SQL,要么全部成功,要么全部失败
  2. ACID 四大特性:
    • 原子性(Atomicity):不可分割
    • 一致性(Consistency):执行前后数据合法
    • 隔离性(Isolation):事务之间互不干扰
    • 持久性(Durability):提交后永久生效
  3.   Undo Log → 保证原子性(Atomicity)                                                                            Redo Log → 保证持久性(Durability)                                                                        MVCC + 锁 → 保证隔离性(Isolation)                                                                              日志 + 锁 + 刷盘 → 保证一致性(Consistency)

    五、事务隔离级别

    1. 读未提交(READ UNCOMMITTED)
      • 会出现脏读、不可重复读、幻读
    2. 读已提交(READ COMMITTED,Oracle 默认)
      • 解决脏读
    3. 可重复读(REPEATABLE READ,MySQL 默认)
      • 解决脏读、不可重复读
      • 通过 间隙锁 + MVCC 解决幻读
    4. 串行化(SERIALIZABLE)
      • 最高级别,无并发问题,性能最差

    企业开发常用:READ COMMITTED 或 REPEATABLE READ


    六、MySQL 锁机制

    1. InnoDB 主要使用 行锁,MyISAM 只支持表锁。
    2. 行锁是加在索引上的,不是加在数据行上。
    3. 如果查询没有命中索引,行锁会退化为全表加行锁,并发极低。
    4. 间隙锁=锁索引之间的空隙,RR级别生效,专门防止范围查询时出现幻读;(a,b)
    5. 间隙锁(GAP 锁)+ 行锁 = 临键锁           类似:(a,b]
      • 作用:在 RR 隔离级别解决幻读
    6. 记录锁:锁单行,防修改。
    7. 间隙锁:锁空隙,防插入。
    8. 临键锁:锁区间 + 记录,RR 默认,彻底解决幻读。
    9. Java 后端开发不需要手动加锁,只需要:
      • 合理建索引
      • 避免无索引更新
      • 避免长事务


    七、MVCC 多版本并发控制

    1. MVCC 是 InnoDB 实现高并发、无锁读写的核心机制。
    2. 基本思想:
      • 每行数据保存多个版本
      • 读不加锁,写加锁,读写不阻塞
    3. 依靠:
      • undo log 版本链
      • readView 可见性判断;          在RR级别仅在事务中第一次指向快照读时生成readView,后续复用                在RC级别每次执行快照读时都生成新的readView
      • 隐藏字段1DB_TRX_ID :记录生成这行数据的事务ID,判断这个版本是谁改的、是否可见    2DB_ROLL_PTR : 回滚指针,指向undo log里的上一个历史版本,靠他串联版本    3)DB_ROW_ID : 隐藏主键,表没有主键时就用这个当主键(了解为主)
    4. 实现效果:
      • 快照读(普通 select)无锁
      • 当前读(select for update /update/insert)加锁

    八、开发与面试总结

    1. 业务开发只需要掌握:
      • 正确建表、建索引
      • 能用 EXPLAIN 分析 SQL
      • 理解事务与隔离级别
      • 知道行锁与索引的关系
      • 了解 MVCC 思想:读不加锁写加锁,读写互不阻塞,既保证事务隔离又提升并发性能
    2. 存储过程、触发器、函数、视图、运维等高阶内容,Java 后端基本不用
    3. 把逻辑写在 Java 代码中,数据库只做存储,是现代企业标准规范。
    4.  Redo Log(InnoDB)→ 崩溃恢复,保证不丢数据                                                       Binlog(Server)→ 主从库复制、数据恢复,保证数据能复制、能回滚                                 Undo Log(InnoDB)→ 回滚 + MVCC,保证原子性、多版本

    Logo

    AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

    更多推荐