索引的本質
mysql官方對索引的定義為:索引(index)是幫助mysql高效獲取資料的資料結構。提取句子主幹,就可以得到索引的本質:索引是資料結構。
我們知道,資料庫查詢是資料庫的最主要功能之一。我們都希望查詢資料的速度能盡可能的快,因此資料庫系統的設計者會從查詢演算法的角度進行優化。最基本的查詢演算法當然是順序查詢(linear search),這種複雜度為o(n)的演算法在資料量很大時顯然是糟糕的,好在電腦科學的發展提供了很多更優秀的查詢演算法,例如二分查詢(binary search)、二叉樹查詢(binary tree search)等。如果稍微分析一下會發現,每種查詢演算法都只能應用於特定的資料結構之上,例如二分查詢要求被檢索資料有序,而二叉樹查詢只能應用於二叉查詢樹上,但是資料本身的組織結構不可能完全滿足各種資料結構(例如,理論上不可能同時將兩列都按順序進行組織),所以,在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。
b-tree和b+tree
目前大部分資料庫系統及檔案系統都採用b-tree或其變種b+tree作為索引結構,在本文的下一節會結合儲存器原理及計算機訪問原理討論為什麼b-tree和b+tree在被如此廣泛用於索引,這一節先單純從資料結構角度描述它們。
b-tree
為了描述b-tree,首先定義一條資料記錄為乙個二元組[key, data],key為記錄的鍵值,對於不同資料記錄,key是互不相同的;data為資料記錄除key外的資料。那麼b-tree是滿足下列條件的資料結構:
d為大於1的乙個正整數,稱為b-tree的度。
h為乙個正整數,稱為b-tree的高度。
每個非葉子節點由n-1個key和n個指標組成,其中d<=n<=2d。
每個葉子節點最少包含乙個key和兩個指標,最多包含2d-1個key和2d個指標,葉節點的指標均為null 。
所有葉節點具有相同的深度,等於樹高h。
key和指標互相間隔,節點兩端是指標。
乙個節點中的key從左到右非遞減排列。
所有節點組成樹結構。
每個指標要麼為null,要麼指向另外乙個節點。
如果某個指標在節點node最左邊且不為null,則其指向節點的所有key小於v(key1),其中v(key1)為node的第乙個key的值。
如果某個指標在節點node最右邊且不為null,則其指向節點的所有key大於v(keym),其中v(keym)為node的最後乙個key的值。
如果某個指標在節點node的左右相鄰key分別是keyi和keyi+1且不為null,則其指向節點的所有key小於v(keyi+1)且大於v(keyi)。
資料庫 資料庫索引
索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...
資料庫索引
索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...