数据库可视化

理解查询时,先区分逻辑结果和产生结果的物理工作。连接组合两张表,分组把每组压成一行,窗口函数保留每行身份;索引改变访问页面,B+ 树维护有序页面,LSM 把写入整理延后到刷盘与合并,MVCC 为每个快照选择可见版本。

因此,连接可能增加行数,分组可能减少行数,窗口函数保留行数。索引不应改变查询含义,MVCC 也不改变查询规则,只决定读到哪个版本。

课程比较

课程输入决定规则易错点
SQL 连接两个关系对键比较为 TRUE 的每一对行输出;连接类型决定未匹配行是否保留重复键产生 L_k × R_k 行
GROUP BY 与聚合一个关系按完整分组键元组分配,每组输出一行有 NULL 时,COUNT(*) 与 COUNT(column) 不同
窗口函数一个关系分区、区内排序,为每个当前行计算值窗口 ORDER BY 不保证最终输出顺序
数据库索引有页面的关系、谓词、投影扫描、哈希桶或有序叶子路径;不覆盖投影时跟随 RID低选择性的有效索引也可能比扫描读更多页
B+ 树插入、查找、范围查询内部引导键路由,叶分裂复制分隔键,内部分裂上推分隔键把引导键当成唯一记录副本,会丢失范围结果
LSM 树带版本的写、读、删除先 WAL 再内存,有序刷入 L0,合并保留最大序列号把墓碑当未命中或先读旧文件,会让旧值复活
MVCC并发事务、逻辑行和快照从新到旧,检查创建者与替代版本在快照中的提交可见性旧快照仍需要旧版本时,不能因新版本已提交就回收旧版本

前三课解释逻辑上的配对、组、分区、窗口和同值组,不承诺物理执行算法。索引课再用明确的冷页模型比较访问路径。SQL 规定结果关系,优化器选择获得它的方式。

建议学习顺序

先运行 SQL 连接默认 LEFT JOIN。键 10 的 Ada 有两间匹配办公室,产生两行;键 20、40 无匹配,LEFT 保留员工行,右侧填 NULL。同样输入的结果数分别为 INNER 3、LEFT 5、FULL 6。

再运行 GROUP BY 与聚合的 GROUP BY region。七条交错销售记录分成 North、South、West。North 有三行、两个非空金额,得到 COUNT(*) = 3、COUNT(amount) = 2、SUM(amount) = 200、AVG(amount) = 100。切换分组键,同一关系可产生 1 个全局组、3 个地区组或 6 个 (region, channel) 组。

窗口函数默认运行累计 SUM。North、South 独立分区,区内按日期排序;前缀窗口增长到当前行,把结果写回对应行 ID,七行输入仍是七行输出。RANK 与 DENSE_RANK 都给同值行相同名次,只有 RANK 在并列后留空档。

数据库索引默认 B+ 树点查询得到同一行:扫描读八个数据页,非覆盖 B+ 路径读三页,哈希或覆盖路径读两页。切到 low-selectivity,非覆盖树读十二页,扫描只读八页,说明优化器为何可能拒绝索引。

B+ 树展示有序路径如何形成。三阶树插入六次,触发级联分裂,形成三层。叶分隔键 30 复制到上层,记录仍留在右叶;内部引导键 20 推入新根,并从两个分裂内部页移除。最后范围查询只下降一次,沿三条叶链接,返回 10, 15, 20, 25。

LSM 树展示另一种有序存储。六次修改形成两个有序 L0 文件。内存表的新值和墓碑都会提前终止读取,避免泄漏旧 L0 值。覆盖到底层的完整合并读取六个存储版本,写出三条有效 L1 记录,先安装输出,再退役输入。读放大预设保留三个重叠 L0,缺失键要检查内存和三个文件。

MVCC默认可重复读。T1 固定 S1={T0},即使 T2 追加并提交 $120,仍读 $100;后来的 S2 包含 T2,读 $120。清理先因 S1 需要旧版本而停止,等 T1 结束才回收。保持同一次更新,切到读已提交,每条语句刷新快照,T1 第三次读取就变成 $120。

学习顺序从行数扩张、收缩、保持,走向物理访问、两种有序存储和并发可见性。连接若在聚合或窗口计算前复制了订单,后续会按这些重复行计算;索引无法修复逻辑错误。MVCC 选择符合快照的版本,也不会修正错误的查询规则。

观察重点

  • 连接数的是行对,不是不同键。一个键的左两行与右三行产生六行。
  • 等值连接中 NULL = NULL 不是 TRUE,不会匹配;分组却把多个 NULL 键放入同一组。
  • 每条源记录对选定分组键恰有一个组归属。COUNT(*) 数行,COUNT(amount)、SUM(amount)、AVG(amount) 忽略空金额。
  • PARTITION BY 重新开始窗口计算,不合并行。ROWS 按逻辑行位置扩展,同值组由窗口排序值相等定义。
  • RANK 并列后留空档,DENSE_RANK 不留。没有外层 ORDER BY,逻辑查询结果不保证输出顺序。
  • 索引课按页计费。同一数据页上的多个 RID 共享一次读取。哈希索引支持等值,不保留 BETWEEN 所需键序。
  • 只有叶子存有当前投影列时,覆盖索引才免去数据页读取。
  • B+ 树遇到等于引导键的值走右孩子,因为叶分隔键是右子树首键。叶分裂复制,内部分裂上推。
  • 范围扫描下降一次后沿 next 走,反复回根会失去叶链优势。
  • LSM 先 WAL 后内存,刷盘按键序而非到达顺序。L0 从新到旧,值或墓碑都可终止读取;合并按序列号选版本。
  • 本模型只有完整覆盖到最底层 L1 时才能丢弃墓碑。旧数据若还在未参与合并的文件中,过早丢弃会让它复活。
  • MVCC 的最新存储版本不一定是当前快照可见的最新版本。可重复读保持首条语句快照,读已提交逐语句刷新。
  • 清理依据仍活动快照的可见性需要,不是只看最新已提交余额。

选择需要理解的层次,并认清计数单位:行对、组、保留行上的值、页面读取、B+ 引导键与记录、LSM 修改与版本,或快照选中的行版本。