Appearance
数据库速查
文章清单
<!-- 原头部外链清单来自 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 log | undo log | binlog | |
|---|---|---|---|
| 所属层 | 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 查漏)。