MySQL索引背後的資料結構及演算法原理

2022-09-22 06:42:10 字數 1245 閱讀 8108

閱讀部落格

mysql官方對索引的定義為:索引(index)是幫助mysql高效獲取資料的資料結構。提取句子主幹,就可以得到索引的本質:索引是資料結構。

我們知道,資料庫查詢是資料庫的最主要功能之一。我們都希望查詢資料的速度能盡可能的快,因此資料庫系統的設計者會從查詢演算法的角度進行優化。最基本的查詢演算法當然是順序查詢(linear search),這種複雜度為o(n)的演算法在資料量很大時顯然是糟糕的,好在電腦科學的發展提供了很多更優秀的查詢演算法,例如二分查詢(binary search)、二叉樹查詢(binary tree search)等。如果稍微分析一下會發現,每種查詢演算法都只能應用於特定的資料結構之上,例如二分查詢要求被檢索資料有序,而二叉樹查詢只能應用於二叉查詢樹上,但是資料本身的組織結構不可能完全滿足各種資料結構(例如,理論上不可能同時將兩列都按順序進行組織),所以,在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。

左邊是資料表,一共有兩列七條記錄,最左邊的是資料記錄的實體地址(注意邏輯上相鄰的記錄在磁碟上也並不是一定物理相鄰的)。為了加快col2的查詢,可以維護乙個右邊所示的二叉查詢樹,每個節點分別包含索引鍵值和乙個指向對應資料記錄實體地址的指標,這樣就可以運用二叉查詢在o(log2n)

的複雜度內獲取到相應資料。

雖然這是乙個貨真價實的索引,但是實際的資料庫系統幾乎沒有使用二叉查詢樹或其進化品種紅黑樹(red-black tree)實現的

目前大部分資料庫系統及檔案系統都採用b-tree或其變種b+tree作為索引結構。

紅黑樹等資料結構也可以用來實現索引,但是檔案系統及資料庫系統普遍採用b-/+tree作為索引結構,結合計算機組成原理相關知識討論b-/+tree作為索引的理論基礎。

一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟i/o消耗,相對於記憶體訪問,i/o訪問的消耗要高幾個數量級,所以評價乙個資料結構作為索引的優劣最重要的指標就是在查詢過程中磁碟i/o操作次數的漸進複雜度。換句話說,索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數。下面先介紹記憶體和磁碟訪問原理,然後再結合這些原理分析b-/+tree作為索引的效率。

MySQL索引背後的資料結構及演算法原理

mysql索引背後的資料結構及演算法原理 一 定義 索引定義 索引 index 是幫助mysql高效獲取資料的資料結構。本質 索引是資料結構。二 b tree m階b tree滿足以下條件 1 每個節點至多可以擁有m棵子樹。2 根節點,只有至少有2個節點 要麼極端情況,就是一棵樹就乙個根節點,單細胞...

MySQL索引背後的資料結構及演算法原理(五)

innodb索引實現 雖然innodb也使用b tree作為索引結構,但具體實現方式卻與myisam截然不同。第乙個重大區別是innodb的資料檔案本身就是索引檔案。從上文知道,myisam索引檔案和資料檔案是分離的,索引檔案僅儲存資料記錄的位址。而在innodb中,表資料檔案本身就是按b tree...

MySQL索引及索引資料結構

索引是幫助mysql高效獲取資料的排好序的資料結構 索引分類 索引失效的情況 模糊查詢時,第乙個查詢字元是不確定值 或 時,索引失效 select name from stu where name like e 索引失效 select name from stu where name like h ...