標簽:mysq 示意圖 提取 編號 src mys 目錄 主鍵 strong
接上一篇,現在知道記錄在頁中按照主鍵大小順序串成了單鏈表。
那么我使用主鍵查詢的時候,最順其自然的辦法肯定是從第一條記錄,也就是 Infrimum 記錄開始,一直向后找,只要存在總會找到。這種在數據量少的時候還好說,一旦數據多了,遍歷耗時一定非常長。
于是,作者又想到了一個好辦法,靈感來自于書本中的目錄。我們翻書的時候想查找一些內容,就會去查看目錄,然后直接確定好內容所在的頁碼。
那么對于 InnoDB 來說,過程如下:
這個地方就是頁目錄 Page Directory。而上述的地址偏移量就是該記錄的真實數據與頁面中第 0 個字節之間的距離,這些地址偏移量被稱為槽。
每個槽占用 2 字節,頁目錄就是由多個槽組成。
在上一篇中,創建的表里存在 4 條數據,那么在頁中還要算上 Infimum 和 Supremum,共 6 條記錄。
這時候 InnoDB 會把它們分出 2 個組:
每個槽中,存放著每個組里最大的那條記錄所在頁面中的地址偏移量。
從圖中,需要關注頁目錄的一些點:
為什么這 6 條記錄要這樣分?因為作者對于每組中的記錄數量有規定:
現在繼續向測試表里插入 12 條數據,也就是說在頁中共有 18 條記錄。
然后這些記錄就被分成了 5 個組,這里參考書籍上的示意圖(只保留一些關鍵屬性):
現在,要查找主鍵是 6 的記錄,要如何進行?
因為 5 個槽的編號分別為 0、1、2、3、4 挨著的,并且里面的主鍵值也都是從小到大進行排序的,可以使用二分法(不清楚的可以百度),那么初始情況下 low=0,high=4:
這里有個問題,槽對應的值都是這個組的主鍵最大的記錄,如何找到組里最小的記錄?比如槽 2 對應最大主鍵是 8 的記錄,那如何找到最小記錄。
解決辦法是:
總結
在一個數據頁中查找指定主鍵值的記錄,過程分為 2 步:
標簽:mysq 示意圖 提取 編號 src mys 目錄 主鍵 strong
原文地址:https://www.cnblogs.com/pingguo-softwaretesting/p/15053856.html