系统知识 · 数据库系统

数据库的四个关键词:B+ 树索引、事务 ACID、隔离级别、执行计划——从使用到底层。

系统知识 技术栈:SQL / MySQL / 概念图解 来源:GitHub 参考

知识简介

数据库系统 提供持久化存储与高效查询。理解重点:索引为何加速(B+ 树)、事务如何保证(ACID)、并发隔离级别如何取舍、慢查询如何优化(EXPLAIN)。

核心概念

  • B+ 树索引:非叶子存键、叶子存数据且有链表,适合范围查询;聚簇索引=主键即数据。
  • 事务 ACID:原子性(undo log)、一致性(应用约束)、隔离性(锁/MVCC)、持久性(redo log)。
  • 隔离级别:读未提交(脏读)/读已提交(不可重复读)/可重复读(幻读)/串行化。
  • MVCC:多版本并发控制,快照读不加锁,写写才冲突。
  • 执行计划:EXPLAIN 看 type / key / rows,全表扫描(ALL)是慢查询头号元凶。

代码示例:索引与慢查询分析

sql
-- 建表并加索引
CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  email VARCHAR(64) NOT NULL,
  city VARCHAR(32),
  created_at DATETIME
);
ALTER TABLE users ADD INDEX idx_email (email);      -- 等值查询加速
ALTER TABLE users ADD INDEX idx_city_time (city, created_at);  -- 联合索引

-- 查看执行计划:type=ref/range 说明用到索引,ALL 是全表扫描
EXPLAIN SELECT * FROM users WHERE city = 'Shenzhen' ORDER BY created_at;

-- 反例:对索引列做函数运算会导致索引失效
EXPLAIN SELECT * FROM users WHERE YEAR(created_at) = 2026;  -- 尽量改为范围查询

代码示例:事务与隔离级别

sql
-- 查看/设置隔离级别(MySQL)
SELECT @@transaction_isolation;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 事务示例:转账
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;  -- 失败时 ROLLBACK,保证原子性

-- 模拟脏读(读未提交级别下,事务 A 未提交的修改能被 B 读到)

学习路径

  1. EXPLAIN 分析自己项目的慢查询,学会看索引命中。
  2. 读《高性能 MySQL》索引与事务章节。
  3. 亲手实现一个极简 B+ 树(Python),理解层高与扇出。
  4. 进阶:读 MySQL 源码 InnoDB 的 MVCC 实现。

来源参考

GitHub 关键词:simple-btreemysql-index-demodb-internals-notes(链接可替换为实际仓库地址)。