章节摘要:数据已在页与树里就位,本章解决"一条 SQL 如何变成对页的具体操作"。SQLite 的答案是独有的:先把 SQL 编译成一串字节码,再交给 VDBE 虚拟机逐条执行。我们对照 MySQL 与 PostgreSQL 的直接解释执行路线,走完解析前端的三站流水,逐条分析一份真实的 VDBE 指令清单,最后比较三个引擎的 EXPLAIN 输出形态与预编译语句生命周期。读完本章,EXPLAIN 对你将不再是黑盒输出,而是一份可以逐行核对的执行说明书。
读完本章,你应当能够:
一句金句:MySQL 与 PostgreSQL 把 SQL 当作"待解释的指令",SQLite 把 SQL 当作"待编译的程序"——这一个观念差,衍生出执行、缓存、调试三条产品线上的全部分歧。
3.1 解析前端三库对照:从字符流到表达式树。SQLite 用手写词法器加 Lemon 生成的 LALR 解析器一次成型;MySQL 同为 Bison 系但生成对象是解析树;PostgreSQL 把词法、语法、语义分析分成三段独立子系统。本节另附三库报错风格对照表,跨库工具排查直接可用。
3.2 VDBE 虚拟机与字节码:虚拟机的寄存器模型、指令循环,以及一条点查查询的完整字节码逐行分析——本章的核心中核。范围扫描与聚合指令的读码示例帮助你建立"读码直觉"。
3.3 EXPLAIN 三连与预编译:三个引擎同一条查询的 EXPLAIN 输出对照,预编译语句的生命周期管理,以及自动重编译在 schema 变更时的行为。EXPLAIN 与预编译是后续所有调优章节的两把基础工具。
三节是"编译流水 → 执行机器 → 观察窗口"的链条。3.1 回答"SQL 变成了什么中间形态",3.2 回答"中间形态如何被执行",3.3 给你两样随身工具:看得见计划(EXPLAIN)与复用计划(prepared statement)。前两节建立的概念在 3.3 全部落到可操作的命令上:
3.1 词法与语法 ──▶ 3.2 字节码与虚拟机 ──▶ 3.3 EXPLAIN 与预编译 中间形态 执行引擎 观察与复用 │ ▼ 第4章:写操作的字节码触发日志与锁的完整故事
前置:第 1 章 1.3 节的查询旅程(本章把那张图放大到指令级);第 2 章的 rowid 概念(字节码里的 SeekRowid 指令直接作用在表树上)。
后续延伸:第 4 章的事务字节码会补充 BEGIN、COMMIT 指令与日志页的交互;第 5 章 EXPLAIN QUERY PLAN 的输出格式在本章 3.3 打底;第 7 章 7.3 节的批量写入优化全部建立在"预编译复用"之上。一个思考题先行:为什么 SQLite 宁可维护一个虚拟机,也要把"编译"与"执行"彻底分开?