索引原理

索引是爲檢索而存在的,就是說索引並非一個表必須的。表索引由多個頁面組成,這些頁面一塊兒組成了一個樹形結構,即咱們一般說的B樹,首先來看下錶索引的組成部分:數據庫

根極節點,root,它指向另外兩個頁,把一個表的記錄從邏輯上分紅非葉級節點Non-Leaf Level(枝),它指向了更加小的葉級節點Leaf Level(葉)。 根節點、非葉級節點和葉級節點都位於索引頁中,統稱爲索引葉節點,屬於索引頁的範籌。這些"枝"、"葉"最終指向數據頁Page。根級節點和葉級節點之間 的葉又叫數據中間頁。根節點對應了sysindexes表的Root字段,記載了非葉級節點的物理位置(即指針);非葉級節點位於根節點和葉節點之間,記 載了指向葉級節點的指針;而葉級節點則最終指向數據頁,這就是最後的B樹。指針

   

數據庫是怎樣訪問表數據的:排序

第一:沒有建立任何索引的表。索引

這種表咱們稱爲堆表,由於全部的數據頁都是無序的,雜亂無章的,在查詢數據時,須要一條一條記錄查詢,有時第一條記錄就能找到,最壞的狀況 是在最後一條記錄中查找到,可是千萬不要認爲SQL此時查找到數據後會當成結果當即返回,SQL即便查找到了記錄,也會將全部數據遍歷一次,這能從最終的 執行計劃中得知,就是平時說的表掃描,對於沒有索引的表也能查詢,就是效率會特別低,若是數據量稍大的話。ci

   

問題:SQL是如何得知表沒有索引呢?it

SQL在接到查詢請求的時候,會分析sysindexes表中索引標誌符(INDID: Index ID)的字段的值,若是該值爲0,表示這是一張數據表而不是索引表,SQL就會使用sysindexes表的另外一個字段FirstIAM值中找到該表的 IAM 頁鏈也就是全部數據頁集合。至於什麼是IAM,你們能夠網上搜索下。效率

   

第二:訪問建立有非彙集索引的表。原理

非彙集索引能夠建多個,造成B樹結構,葉級節點不包含數據頁,只包含索引行。若是表中只有非彙集索引,則每一個索引行包含了非彙集索引鍵值以 及行定位符(ROW ID,RID),他們指向具備該鍵值的數據行。RID由文件ID、頁編號和在頁中行的編號組成。當 INDID的值在2-250之間時,說明表中存在非彙集索引頁。SQL調用ROOT字段的值指向非彙集索引B樹的ROOT,查找與被查詢最相近的值,根據 這個值找到在非葉級節點中的頁號,在葉級節點相應的頁面中找到該值的RID,最後根據這個RID在Heap中定位所在的頁和行並返回到查詢端。搜索

上篇文章的cityid上創建了非彙集索引,執行Select * From student Where cityid='0101'時,查詢過程是:遍歷

  1. 在sysindexes表查詢INDID值爲2,說明有非彙集索引;

  2. 從根出發,在非葉級節點中定位最接近0101的值(枝節點),查到其位於葉級頁面的第n頁;

  3. 在葉級頁面的第n頁下搜尋0101的RID,其RID顯示爲N∶i∶j,表示cityid字段中名爲0101的記錄位於堆的第i頁的第j行,N表明文件的ID值。

  4. 在堆的第 i頁第j行將該記錄返回給客戶端。

   

第三:訪問建立有彙集索引的表。

   

彙集索引中,數據所在的數據頁是葉級,索引數據所在的索引頁是非葉級。原理和上述非彙集索引的查詢差很少,因爲記錄是按彙集索引鍵值進行排序,即彙集索引的索引鍵值也就是具體的數據頁。這種狀況比起非彙集索引要簡單不少,由於比非彙集索引少了一層節點查詢。

上篇文章的username字段上創建了彙集索引,此時執行Select* From student Where username='1'時,查詢過程是:

  1. 在sysindexes表查詢INDID值爲1,說明表中創建了彙集索;

  2. 從根出發,在非葉級節點中定位最接近1的值(枝節點),再查到其位於葉級頁面的第n頁;

  3. 在葉級頁面第n頁下搜尋值爲1的條目,而這一條目就是數據記錄自己;

  4. 將該記錄返回客戶端。

 

下圖可作參考:

第四:怎樣訪問既有彙集索引、又有非彙集索引的數據表:

username字段上創建了彙集索引,cityid上創建了非彙集索引,當執行Select * From student Where cityid='0101'時,查詢過程是:

  1. 在sysindexes表查詢INDID值爲2,說明有非彙集索引;

  2. 從根出發,在cityid的非彙集索引的非葉級節點中定位最接近0101的條目;

  3. 從上面條目下的葉級頁面中查到0101的邏輯位置,是彙集索引的指針;

  4. 根據指針所指示位置,進入位於username的彙集索引中的葉級頁面中找到0101數據記錄;

  5. 將該記錄返回客戶端。

相關文章
相關標籤/搜索