Skip to content

数据库速查 ​

文章清单 ​

<!-- 原头部外链清单来自 DemoTransfer/LearningRecord java/interview/数据库 目录,2026-10 本地化。原《索引》《数据库常见分库分表方案》篇目已分别并入/对应库内《数据库两大神器之索引》《数据库怎么分库分表》。 -->

一、索引要点 ​

  • 为什么快:B+ 树把无序数据组织成有序目录,全表扫描 O(N) 降为树高查找 O(logN)。3~4 层树高即可支撑千万级表。

  • 聚簇索引与回表:InnoDB 主键索引即聚簇索引(叶子存整行),二级索引叶子只存主键值。查非索引列要拿主键回表。覆盖索引(查询列全在索引里)可免回表。

  • 最左前缀原则:联合索引 (a,b,c) 相当于 (a)、(a,b)、(a,b,c) 三套索引。跳过左列、范围查询右侧的列都用不上索引。

  • 常见失效场景:索引列上做函数/运算、隐式类型转换(字符串列传数字)。还有 like '%xx' 前置模糊、or 两侧不全是索引列。

  • 唯一索引 vs 普通索引:读差不多(InnoDB 找到一条即停 vs 顺着多读几条)。写唯一索引要校验唯一性、用不上 change buffer。详见 数据库两大神器之索引。

二、事务要点 ​

  • ACID 各自由谁保证:原子性靠 undo log 回滚,持久性靠 redo log 刷盘。隔离性靠锁 + MVCC,一致性是前三者共同追求的结果。

  • 隔离级别速记(脏读 / 不可重复读 / 幻读,细节见 脏读、幻读、不可重复读区别):

隔离级别脏读不可重复读幻读
读未提交 RU会会会
读已提交 RC不会会会
可重复读 RR(MySQL 默认)不会不会基本不会(临键锁+MVCC)
串行化不会不会不会
  • MVCC:隐藏事务列 + undo log 版本链 + ReadView 实现快照读,读写互不阻塞。RC 每条语句生成一个 ReadView,RR 复用事务内的第一个 ReadView——这是两者隔离差异的根源。

三、锁要点 ​

  • 按粒度:表锁开销小加锁快、并发低;行锁开销大加锁慢、并发高。InnoDB 行锁锁的是索引,条件没走索引会退化为锁全表记录。

  • 按模式:共享锁 S(读锁)与排他锁 X(写锁),读读兼容、读写与写写互斥。意向锁(IS/IX)是表级"占位"锁,让行锁与表锁能快速判断冲突。

  • 行锁三兄弟:记录锁锁一行、间隙锁锁一个区间、临键锁(Next-Key)= 记录 + 前面的间隙。RR 级别靠它挡住幻读。唯一索引等值命中会退化为纯记录锁。

  • 死锁姿势:按相同顺序访问表和行、事务尽量小、给条件建索引避免锁放大。排查用 show engine innodb status 看 LATEST DETECTED DEADLOCK。详见 数据库两大神器之锁。

四、日志三件套:redo / undo / binlog ​

redo logundo logbinlog
所属层InnoDB 引擎层InnoDB 引擎层Server 层(所有引擎)
内容物理日志,记"某页某处改成了什么"逻辑日志,记反向操作(insert 记 delete)逻辑日志,记语句或行变更
作用崩溃恢复,保证持久性回滚 + 给 MVCC 提供版本链主从复制、按时间点恢复
写法固定大小,环形循环写随事务写,不能关闭追加写,写满换文件
  • 两阶段提交:redo log 写 prepare → 写 binlog → redo log 写 commit,保证 redo 与 binlog 的一致性。少了这步,崩溃恢复后主库与从库会出现不一致。

  • 刷盘参数 innodb_flush_log_at_trx_commit:1=每次提交刷盘最安全,0/2=性能换安全;binlog 的 sync_binlog 同理,"双 1"是最安全组合。

五、连接池要点 ​

  • 为什么池化:建连成本高(TCP 握手 + 认证 + 权限校验),复用连接、削峰限流,还能控制 DB 侧连接总数。

  • 核心参数:最小/最大连接数、空闲超时、最大存活时间、获取连接超时。HikariCP 建议池大小从 "核数 * 2" 起估再压测校准,不是越大越好。

  • 连接过多反而慢:MySQL 每个连接一个线程,连接数暴涨带来上下文切换,RT 先恶化。让请求在池里排队,好过在 DB 里排队。

  • 保活与校验:空闲检测 + testWhileIdle 防止连接被 DB/防火墙悄悄掐断。获取超时先看连接被什么占着(慢 SQL、长事务、大结果集未读完),再查池配置。

  • 排查套路:连接超时 → show processlist 看活跃连接在等什么 → 慢 SQL 与未提交事务 → 最后才考虑加连接数。扩展见 MySQL8新特性速览 与 数据库怎么分库分表。

2026-10 扩充(Round1 查漏)。