## 数据库性能中的时空局部性 近期在PGConf NYC的讨论,由Postgres 18的异步IO工作引发,强调了正向和反向数据扫描之间的性能差异。这源于操作系统预取数据的方式——对正向扫描有效,但对反向扫描无效,揭示了**局部性**在数据库性能中的重要性。 局部性包括**时间局部性**(最近访问的数据很可能再次被访问)和**空间局部性**(附近的数据很可能很快被访问)。一个关键假设是**时空局部性**:在同一时间写入的数据将在同一时间被读取,因此应该存储在一起。 这个假设并非普遍成立。流式系统和时序数据库从中受益匪浅,而基于哈希的数据库(如DynamoDB)则故意避免它以加快写入速度,牺牲读取性能。关系数据库通常使用时间顺序的键,有时以牺牲写入性能为代价,并且数据库系统通常会实现优化来减轻缺点。 作者认为,对于典型的OLTP工作负载,这个假设是弱成立的,最近的数据是“热”数据。最终,理解并为时空局部性设计——或者有意识地拒绝它——对于根据特定工作负载特征优化数据库性能至关重要。