99% 以上 SQL(索引範圍掃描、等值查詢、唯一查詢)都在 B+ 樹頁面內透過二分查找定位記錄。
| 模式 | 值 | 對應 SQL | 定位目標 |
|---|---|---|---|
PAGE_CUR_G | 1 | b > 4 | 最後一個 4 之後 |
PAGE_CUR_GE | 2 | b >= 4 / = | 第一個 4 |
PAGE_CUR_L | 3 | b < 2 | 第一個 2(反向掃描) |
PAGE_CUR_LE | 4 | b <= 2 | 最後一個 2(反向掃描) |
頁面可能無用戶記錄(全刪除未合併),low=high=0 直接計算 mid 會越界。內核先判斷 PAGE_GET_N_RECS(page) == 0 直接返回。
mid = (low + high) / 2 — 極端情況溢出mid = low + (high - low) / 2 — 安全,推薦遞迴有壓棧/出棧開銷,內核全用 while (low <= high) 迴圈。InnoDB、PostgreSQL 均無遞迴實現。
naïve 做法:二分定位任一等值 → 線性掃描首/尾。若頁面 400 筆同值,需 200 次比較。
內核做法:比較函數內部根據 mode 修正返回值,使等值仍走二分分支,log2(400) ≈ 9 次搞定。
InnoDB 依 mode 決定等值時移動 low 或 high:
G / LE:等值視為「小於」→ low = mid + 1GE / L:等值視為「大於」→ high = mid - 1TNT 引擎採用查表法,含 includeKey、forward 兩維度:
操作符 includeKey forward | cmp=1 0 -1 >= 1 1 | 1 -1 -1 > 0 1 | 1 1 -1 = 1 1 | 1 -1 -1 < 0 0 | 1 -1 -1 <= 1 0 | 1 1 -1