{
  "status": "shipping",
  "advantages": [],
  "limitations": [],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-10-22",
  "slug": "b-link-tree",
  "term": "B-link tree",
  "aliases": [
    "B link tree",
    "Lehman-Yao tree"
  ],
  "definition": "A B-link tree augments an ordered search tree with high keys and right-sibling links so searches can recover from concurrent node splits.",
  "note": "A stale parent route may reach the left half of a newly split node. If the sought key exceeds that node's high key, the search follows a right link toward the correct range. Lehman and Yao's model assumes private page copies and allows reads without acquiring its update locks; section 6.4 explicitly leaves livelock possible. [lehman-yao]\n\nPostgreSQL adapts the algorithm to shared buffers and uses page-level read locks. The paper's no-read-lock property must not be restated as a lock-free PostgreSQL guarantee. These links solve index-navigation races, not MVCC visibility or crash recovery by themselves. [nbtree]",
  "related": [
    "b-tree",
    "postgresql-index-only-scan",
    "postgresql-visibility-map"
  ],
  "citations": [
    {
      "id": "lehman-yao",
      "title": "Lehman and Yao (1981), Efficient Locking for Concurrent Operations on B-Trees, TODS 6(4), 650-670; DOI 10.1145/319628.319663",
      "url": "https://www.cs.cmu.edu/~dga/15-712/F07/papers/Lehman81.pdf",
      "accessed": "2026-10-22"
    },
    {
      "id": "nbtree",
      "title": "PostgreSQL REL_16_15: Btree Indexing, algorithm and shared-buffer differences",
      "url": "https://github.com/postgres/postgres/blob/7d3e000c5961a544302072058a1184e9a588837b/src/backend/access/nbtree/README",
      "accessed": "2026-10-22"
    }
  ],
  "provenance": [
    "Source review of the 1981 algorithm and PostgreSQL REL_16_15 implementation notes; no concurrent workload or speedup was measured."
  ]
}
