第3章 SQL 编译与虚拟机


第3章 · SQL 编译与虚拟机

章节摘要:数据已在页与树里就位,本章解决"一条 SQL 如何变成对页的具体操作"。SQLite 的答案是独有的:先把 SQL 编译成一串字节码,再交给 VDBE 虚拟机逐条执行。我们对照 MySQL 与 PostgreSQL 的直接解释执行路线,走完解析前端的三站流水,逐条分析一份真实的 VDBE 指令清单,最后比较三个引擎的 EXPLAIN 输出形态与预编译语句生命周期。读完本章,EXPLAIN 对你将不再是黑盒输出,而是一份可以逐行核对的执行说明书。

学习目标

读完本章,你应当能够:

  1. 复述 SQL 在 SQLite 内部的完整编译流水:词法切分、LALR 语法分析、表达式树构建、字节码生成,并指出每一站与 MySQL、PostgreSQL 对应阶段的异同。
  2. 读懂 VDBE 指令格式(地址、操作码、三个操作数与注释),能手读一份简单点查的字节码清单。
  3. 解释寄存器在 VDBE 里的作用:参数、中间值、结果行如何经由寄存器传递。
  4. 对比三个引擎 EXPLAIN 输出的形态差异:字节码表、表格计划、计划树,并知道各自怎么读。
  5. 说明预编译语句(prepared statement)在三库中的生命周期与防注入原理,知道 SQLite 的自动重编译机制。

核心概念速览

一句金句: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 宁可维护一个虚拟机,也要把"编译"与"执行"彻底分开?

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U