標籤:blog http ar 使用 sp 資料 2014 log bs
在談論資料庫效能最佳化的時候,通常都會提到“索引”,但很多人其實並沒有真正理解索引,也沒有搞清楚索引為什麼就能加快檢索速度,以至於在實踐中並不能很好的應用索引。事實上,索引是一種廉價而且十分有效最佳化手段,設計優良的索引對查詢效能提升確實能起到立竿見影的效果。
相信很多讀者,都瞭解和使用過索引,可能也看過或者聽過”新華字典“、”圖書館“之類比較通俗描述,但是對索引的儲存結構和本質任然還比較迷茫。
有資料結構和演算法基礎的讀者,應該都學過或者寫過“順序尋找,二分尋找(折半)尋找,二叉樹尋找”這幾種很經典的尋找演算法。其中,順序尋找效率是最低的,其演算法複雜度為O(n),而二分尋找演算法複雜度為O(logn)但要求資料是必須為有序的,通常在鏈表中使用廣泛。而二叉樹尋找的複雜度僅為O(log2n),但要求資料結構為“樹”。:
在主流的關係型資料庫中,使用和支援最廣泛的要屬B-Tree索引。為了便於理解,且考慮到大部分讀者資料結構知識有限,讀者可以把B-Tree(或者其變種B+Tree)理解為特殊的二叉樹。雖然這並不精確,但是相信讀者看了之後,已經大致明白了為什麼通過索引尋找資料會比普通的表掃描會快很多。
sqlserver中的叢集索引
叢集索引的葉子節點(最底下的節點)直接包含了資料頁。
sqlserver中的非叢集索引
在有叢集索引的表中,非叢集索引的葉子節點,包含的是叢集索引的索引值(可以理解為叢集索引的指標)。
在沒有叢集索引的堆表中,非叢集索引包含的是RID(可以理解為資料行的指標)。
在mysql中,通常也有“叢集索引”(針對InnoDB引擎)和“非叢集索引”(針對MyIsam引擎),“主鍵索引"和”二級索引“。
mysql InnoDB引擎中的索引結構
在主鍵索引中,葉子節點包含了資料行(資料頁),二級索引的葉子介面,存放的是主鍵索引的索引值(指向的主鍵索引)
mysql MyIsam引擎中的索引結構
主鍵索引與二級索引結構上沒有太大的區別,葉子節點都儲存的資料行資訊(例如row number等)可以直接指向並定位到資料行
相信讀者不難看出,B-Tree索引在sqlserver和mysql中的結構、儲存方式、原理都是大致相同的。當然,也有很多細節和內部實現上的差異。
限於筆者水平和理解有限,文中全部文字和描述等全憑筆者記憶寫出,難免出現錯誤,敬請熱心的讀者及時批評和指正。
由於時間有限,大部分圖片筆者畫的比較粗糙,也請讀者諒解。
本文出自http://blog.csdn.net/dinglang_2009,轉載請註明出處。
B-Tree索引在sqlserver和mysql中的應用