知识卡片

写路径与读路径:索引、缓存、物化视图都在改变这条边界

结构图卡

内容

数据流系统创建并维护衍生数据集(搜索索引、物化视图、预测模型)的过程称为写路径——数据一旦写入系统,无论有没有人查询,都会立刻经过批处理/流处理的多个阶段完成更新;而当用户发起请求、需要从衍生数据集中读取(也许还要做些额外处理)来构建响应,走的是读路径——只有当有人请求时才会发生。写路径类似函数式语言里的立即求值,读路径类似惰性求值;衍生数据集正是写路径和读路径相遇的地方,代表了”写入时预先做多少工作”与”读取时临时做多少工作”之间的权衡。全文搜索索引就是典型例子:没有索引,搜索退化成扫描全部文档(写路径零开销,读路径开销巨大);为所有可能查询预先算好结果,读路径开销趋近于零,但可能查询集合无限大,写路径开销不可接受;折中方案是只为一组固定的高频查询预先算结果(这就是缓存,也可称物化视图,因为底层数据变化时需要更新这些预算结果),不常见的查询仍走索引。由此看,索引不是唯一的写读边界;缓存常见结果、无索引扫描小数据集,都是同一条边界在不同位置的取舍——它们的作用都是通过在写路径上多做工作,换取读路径上少做工作。

结构图

flowchart LR
    A[写入数据] -->|写路径: 立即求值,不管是否有人查询| B[衍生数据集]
    B -->|读路径: 惰性求值,仅在被请求时发生| C[用户响应]
    D[无索引扫描: 写路径零开销] -.边界左移.-> E[读路径开销大]
    F[全量预计算: 写路径开销不可接受] -.边界右移.-> G[读路径开销趋零]
    H[索引/缓存/物化视图: 折中] -.边界居中,预先算好高频结果.-> I[写路径多做,读路径省事]

参考来源

- 位置:《数据密集型应用系统设计》第十二章《数据系统的未来》"观察衍生数据状态""物化视图和缓存"(源文件:_epub-src/ch12_split_001.html) - 结论依据:原文定义写路径(数据写入即完成的预计算)与读路径(用户请求时才发生的处理)及两者与立即求值/惰性求值的类比,并用全文搜索索引在无索引/全量预计算/常见查询缓存三种方案间的对比说明索引、缓存、物化视图都是在挪动这条边界,直接支撑本卡片的结构图与解释。 - 原始内容:写路径是预计算过程的一部分……读路径是这个过程中只有当有人请求时才会发生的部分……缓存,索引和物化视图的作用很简单:它们改变了读路径与写路径之间的边界。