首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 內核級二分查找實現詳解:Search Mode、中值計算、遞歸 vs 迭代、等值定位策略

     編輯:MySQL 綜合教學

為什麼研究二分查找?

在數據庫內核(InnoDB、PostgreSQL 等),**99% 以上的索引查找**都依賴二分查找:

  • B+ 樹頁內記錄定位
  • 範圍掃描起始點(> vs >=)
  • 唯一鍵精確匹配
  • 反向掃描定位

一個錯誤的二分查找會導致數據遺漏、死循環、越界訪問,嚴重影響正確性與效能。

五大經典坑點與內核級對策

1. 參數有效性檢查

頁面可能無用戶記錄(全刪除未合併),low=high=0。若直接計算 mid 訪問記錄 → **邏輯錯誤/段錯誤**。
內核做法: 進入二分前判斷 PAGE_GET_N_RECS(page) == 0 直接返回「未找到」。

2. 中值計算溢出風險

  • 寫法 A:mid = (low + high) / 2 — low+high 可能溢出(32 位系統)。
  • 寫法 B:mid = low + (high - low) / 2 — **數學等價但永不溢出**,保證 low < mid < high。

InnoDB 選擇: 頁內記錄數有限(8KB/16KB 頁),low+high 不會溢出,**為簡潔採用寫法 A**;但通用庫建議寫法 B。

3. 遞歸 vs 迭代

  • 遞歸:壓棧/出棧開銷大、棧深度受限、難以優化。
  • 迭代:零開銷、可展開、便於編譯器優化。

所有主流數據庫內核(InnoDB、PostgreSQL、SQLite)均採用迭代實現。

4. 等值區間定位:第一個 vs 最後一個

索引頁常有大量重複鍵值(如用戶訂單)。
naïve 做法: 二分找到任一等值 → 順序掃描至首/尾,**最壞 O(N)**。
內核做法: 將「比較結果」按 Search Mode** 糾正,使等值仍繼續二分:

Search ModeSQL 對應等值時動作
PAGE_CUR_G (1)>視為「大於」→ low = mid,繼續向右找**最後一個等值**
PAGE_CUR_GE (2)>=, =視為「小於」→ high = mid,繼續向左找**第一個等值**
PAGE_CUR_L (3)<視為「小於」→ high = mid,向左找**第一個等值**
PAGE_CUR_LE (4)<=視為「大於」→ low = mid,向右找**最後一個等值**

如此,**全程 O(log N) 完成首/尾定位**,無須退化掃描。

5. 通用比較矩陣(TNT 引擎方案)

/* 運算符 includeKey  forward  compare result:  1   0   -1 */
===================================================================
>=       1         1      |   1   -1   -1
=        1         1      |   1   -1   -1
>        0         1      |   1    1   -1
<        0         0      |   1   -1   -1
<=       1         0      |   1    1   -1
===================================================================
  • includeKey:是否包含邊界值(>=/<= 為 1)
  • forward:掃描方向(1=正向,0=反向)
  • 表格給出比較結果(1=大於、0=等於、-1=小於)在各模式下的**糾正值**,直接決定 low/high 移動。

工程落地清單

  1. 入口檢查:空頁面、邊界有效性。
  2. 中值計算:mid = low + (high - low) >> 1(位運算更快)。
  3. 循環條件:while (low < high) 或 low <= high,視具體收斂邏輯。
  4. 比較函數:返回 -1/0/1,供 Search Mode 糾正。
  5. 糾正邏輯:查表或 switch 映射,避免分支預測失敗。
  6. 退出條件:返回 low 或 high 作為插入/掃描起始槽位。
  7. 測試用例:覆蓋空頁、單記錄、全等值、邊界值、反向掃描、併發修改下的 MVCC 可見性。

總結

二分查找看似簡單,**邊界條件、等值語義、溢出安全、迭代實現**四大維度決定了數據庫內核的穩健度。參考 InnoDB page_cur_search_with_match、PostgreSQL _bt_search 等經典實現,構建屬於自己的高效、正確的二分查找組件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved