CalcGuide · 技术博客主页 / 一页纸学习计划
🟠

索引与查询计划:从 EXPLAIN 到执行优化

分类:计算机基础 · 路径:docs/topics/index-and-query-plan/README.md

#database#sql#index

理解 B+Tree、Hash、GiST 索引;能读 EXPLAIN、识别慢查询与全表扫描

父主题

数据库原理与 SQL:从关系模型到事务隔离

子主题(0)

索引与查询计划:从 EXPLAIN 到执行优化

0. 元信息

1. 学习路线

数据分布 → 统计信息 → 候选访问路径 → 成本估算 → 执行计划

2. 阶段周数分配

本子主题按实验推进,不固定周数。每完成一个概念就留下 SQL、输入数据、输出和解释。

3. 九阶段表(精简)

阶段核心知识实践产出学会标准
1. 建模heap、page、B+Tree、Hash、GiST、statistics、planner、executor概念图与最小 schema能说清每个概念解决什么问题
2. 实验PostgreSQL 行为、错误与边界可重跑 SQL能预测正常和异常结果
3. 对照MySQL/SQLite 差异差异表能区分标准语义和实现行为
4. 工程版本、数据规模、可观测输出技术报告能用证据解释选择

4. 第一周任务

精简版不固定 Day 1~7。执行约定是 PostgreSQL 16+、psql -v ON_ERROR_STOP=1、脚本可在空库重复运行。

5. 阶段通用验收

以 §3 的可观察标准和 §9.4 题目为验收。

6. 最终验收

独立完成一份最小实验、三组数据、一份解释和一次 PostgreSQL/MySQL 行为对照。

7. 综合项目

并入父主题“小型电商数据库”,本子主题负责 查询计划调优 的设计、实验与报告。

本主题贡献

交付物清单

  1. plans/before.sql / plans/after.sql:3 条核心查询改前 / 改后 EXPLAIN ANALYZE 全量文本(含 cost / rows / time / Buffers),落到 git 仓库可复现到 commit hash;
  2. plans/composite_index.md:≥ 5 条复合索引设计,附「等值列放最左、范围列在后」的 EXPLAIN 证据与前缀规律演示;
  3. plans/stats_skew.md:制造数据倾斜后 estimated vs actual rows ≥ 10× 偏差的 3 条 SQL,证明重新 ANALYZE 与扩展统计 (CREATE STATISTICS) 的效果;
  4. plans/pg_vs_mysql_explain.md:PostgreSQL EXPLAIN (ANALYZE, BUFFERS) 与 MySQL EXPLAIN FORMAT=TREE / JSON 在 hash join / nested loop / index condition pushdown / BKA 上的差异。

验收标准

8. 推荐资料

见 §9.3。先用 PostgreSQL 官方文档和课程实验,书用于补理论。

9. 学习资料汇聚(v0.3 自包含)

9.1 背景与动机

索引减少扫描范围,成本优化器选择访问路径。真实系统还要处理数据规模、失败和并发。我们用 PostgreSQL 实验观察语义,再用 MySQL 核对实现差异。

9.2 概念地图

flowchart LR
  A[需求与数据] --> B[关系与约束]
  B --> C[SQL]
  C --> D[Planner / Transaction]
  I[Index / Statistics] --> D
  D --> E[执行与并发]
  E --> F[结果 / 延迟 / 锁等待]
  F --> G[验证与修改]
  G --> C

核心概念:heap、page、B+Tree、Hash、GiST、statistics、planner、executor。图中从业务不变量出发,经 SQL、计划或事务到可观察结果,再用相同数据验证修改。

9.3 基础知识讲解

9.3.1 经典论文

资料贡献读法
Codd, A Relational Model of Data for Large Shared Data Banks关系模型与 data independence读定义与例子
Selinger et al., Access Path Selection in a Relational DBMS成本优化器对照 EXPLAIN
Gray et al., Granularity of Locks and Degrees of Consistency锁与一致性画锁兼容和事务 schedule

9.3.2 经典书籍

侧重用法
Silberschatz, Korth & Sudarshan, Database System Concepts全景教材读本子主题对应章
C. J. Date, Database Design and Relational Theory关系理论核对键、依赖与范式
Joe Celko, SQL for Smarties高级 SQL复做集合式查询

9.3.3 优秀博客与文档

资料特点用法
PostgreSQL Documentation权威行为说明查目标版本
Use The Index, LukeMarkus Winand 的索引与 SQL 案例复现实验
MySQL Reference ManualMySQL/InnoDB 对照核对方言和默认值

9.3.4 核心人物

人物影响材料
Edgar F. Codd关系模型1970 论文
C. J. Date关系理论与教学关系理论著作
Andy Pavlo数据库系统教学与研究CMU 15-445 课程

9.3.5 开发与学习方法

方法动作何时用
Query-first先写期望结果和业务不变量正确性设计
Single-variable experiment每次只改一处 SQL、索引或事务设置因果验证
Differential testPostgreSQL 与 MySQL 对跑识别标准与实现差异

课程补充:CMU 15-445 适合数据库实现,Berkeley CS186 适合系统课程与实验。Andy Pavlo 的课堂讲解用于连接论文、实现与计划输出。

9.4 经典问题与经典案例

问题为什么重要最简答案
为什么有索引仍 Seq Scan防止概念或工程误判低选择性或小表时顺扫更便宜
复合索引列顺序怎么定防止概念或工程误判看等值、范围、排序与查询前缀
estimated rows 偏差为何危险防止概念或工程误判会导致错误 join order 和算法
EXPLAIN ANALYZE 做什么防止概念或工程误判真实执行并报告 actual time/rows
覆盖索引一定不回表吗防止概念或工程误判可见性与实现条件仍可能访问 heap
GiST 适合什么防止概念或工程误判多维、范围、几何等可扩展操作类

9.5 学习难点

概念难点

难点为什么会卡突破路径
抽象语义与产品实现教材定义和默认行为容易混在一起先写标准概念,再查目标版本文档
多个概念同时影响结果单看 SQL 文本不够画数据、计划或事务时间线
NULL、重复或并发边界正常样例会隐藏问题强制加入边界数据和双会话实验

思维难点

难点为什么会卡突破路径
集合与状态推理容易按应用循环想问题先写结果关系或状态不变量
从相关性到因果改动后变快不代表改动有效固定数据与环境,每次只改一项
正确性与性能并看快结果可能是错结果先断言结果,再比较计划和耗时

工程难点

难点为什么会卡突破路径
数据形状不真实小样本计划没有代表性测规模、选择性、倾斜和 NULL
版本差异默认值与语法会变保存 SELECT version() 和引用日期
实验不可重跑手工操作丢步骤DDL、seed、query、cleanup 全写脚本

9.6 技术标准与接口

9.6.1 Entity

名称主流版本发布组织状态许可证 / 可访问性
PostgreSQL16~18PGDG活跃PostgreSQL License;文档公开
MySQL8.4 LTS / 9.xOracle活跃GPLv2 Community / 商业版
SQLite3.xSQLite Consortium活跃Public Domain
Oracle Database19c / 23aiOracle活跃商业许可
SQL Server2022 / 2025Microsoft活跃商业/Developer
SQLISO/IEC 9075ISO/IEC JTC 1/SC 32持续修订正文通常收费

9.6.2 Scope

本子主题处理 查询计划调优。SQL 标准描述通用语义,产品文档描述 planner、storage、locking 等实现。不要把 PostgreSQL 扩展当成所有数据库的共同保证。

9.6.3 Structure

必须掌握的接口:DDL/DML、约束、SELECT/JOIN、事务控制、EXPLAIN (ANALYZE, BUFFERS)、system catalog 与统计视图。具体重点是:heap、page、B+Tree、Hash、GiST、statistics、planner、executor。

9.6.4 Ecosystem

PostgreSQL 是主实验环境。MySQL 用于 InnoDB 和 optimizer 对照。SQLite 适合单文件实验。Oracle 与 SQL Server 用来了解企业产品的方言、执行计划和并发差异。JDBC、ODBC、DB-API 是常见客户端接口。

9.6.5 Depth Tiers

层级能力可观察标准
L0知道存在能说出核心名词
L1看得懂示例能读 SQL、计划或事务脚本
L2能正确调用能完成正常与边界实验
L3能解释与排错能用结果、计划、锁或日志解释问题并验证修改
L4能设计与扩展能修改优化器、存储或并发控制实现

本计划要求达到 L3

9.6.6 Source

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言
  2. 数据结构与算法
  3. 计算机基础
  4. 工程技术
  5. Web 与后端
  6. 前端与客户端
  7. 数据与人工智能
  8. 项目与职业能力
  9. 安全与可靠性

本计划归属:计算机基础 主 + Web 与后端 辅。


直接依赖(1)

查看知识图谱