軟體開發人員真的了解SQL索引嗎 索引原理

2021-09-06 02:00:40 字數 2055 閱讀 3103

上篇文章我粗略的總結了些sql聚集索引與非聚集索引的區別,但看起來好像不太清晰,這篇我通過索引原理來再一次分析下。

說明:下面所指的b樹是指平衡樹。

索引是為檢索而存在的,就是說索引並不是乙個表必須的。表索引由多個頁面組成,這些頁面一起組成了乙個樹形結構,即我們通常說的b樹, 首先來看下表索引的組成部分:

根極節點,root,它指向另外兩個頁,把乙個表的記錄從邏輯上分成非葉級節點non-leaf level(枝),它指向了更加小的葉級節點leaf level(葉)。 根節點、非葉級節點和葉級節點都位於索引頁中,統稱為索引葉節點,屬於索引頁的範籌。這些「枝」、「葉」最終指向資料頁page。根級節點和葉級節點之間的葉又叫資料中間頁。根節點對應了sysindexes表的root欄位,記載了非葉級節點的物理位置(即指標);非葉級節點位於根節點和葉節點之間,記載了指向葉級節點的指標;而葉級節點則最終指向資料頁,這就是最後的b樹。   

資料庫是怎樣訪問表資料的:

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

這種表我們稱為堆表,因為所有的資料頁都是無序的,雜亂無章的,在查詢資料時,需要一條一條記錄查詢,有時第一條記錄就能找到,最壞的情況是在最後一條記錄中查詢到,但是千萬不要認為sql此時查詢到資料後會當成結果立即返回,sql即使查詢到了記錄,也會將所有資料遍歷一次,這能從最終的執行計畫中得知,就是平時說的表掃瞄,對於沒有索引的表也能查詢,就是效率會特別低,如果資料量稍大的話。

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

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:將該記錄返回客戶端。

下圖可做參考:

出處: 

軟體開發人員真的了解SQL索引嗎 索引使用原則

原文 軟體開發人員真的了解sql索引嗎 索引使用原則 前兩篇文章我總結了一些sql資料庫索引的問題,這篇主要來分析下索引的優缼點,以及如何正確使用索引。索引的優點 這個顯而易見,正確的索引會大大提高資料查詢,對結果進行排序 分組的操作效率。索引的缺點 優點顯而易見,同樣缺點也是顯而易見 1 建立索引...

軟體開發人員真的了解SQL索引嗎 聚集索引

其實對於非專業的資料庫操作人員來講,例如軟體開發人員,在很大程度上都搞不清楚資料庫索引的一些基本知識,有些是知其一不知其二,或者是知其然不知其所以然。造成這種情況的主要原因我覺的是行業原因,有很多公司都有自己的dba團隊,他們會幫助你優化sql,開發人員即使不懂優化問題也不大,所以開發人員對這方面也...

軟體開發人員的出路

已經從事了一段時間的.net開發,目前在公司裡乙個人負責乙個系統,什麼都得自己去做,只能逼著自己去學啦。分析能力自我感覺還不錯,想以後轉行到系統分析師,請問各位有經驗的大俠,1.由開發人員走哪條路會比較順利的轉到系統分析師?2.目前系統分析師在軟體行業需求怎麼樣?3.系統分析師一般需要具備哪方面的知...