標籤:資料庫查詢 資料庫系統 資料庫索引 文章 設計者
本文以MySQL資料庫為研究對象,討論與資料庫索引相關的一些話題。特別需要說明的是,MySQL支援諸多儲存引擎,而各種儲存引擎對索引的支援也各不相同,因此MySQL資料庫支援多種索引類型,如BTree索引,雜湊索引,全文索引等等。為了避免混亂,本文將只關注於BTree索引,因為這是平常使用MySQL時主要打交道的索引,至於雜湊索引和全文索引本文暫不討論。
文章主要內容分為三個部分。
第一部分主要從資料結構及演算法理論層面討論MySQL資料庫索引的數理基礎。
第二部分結合MySQL資料庫中MyISAM和InnoDB資料存放區引擎中索引的架構實現討論叢集索引、非叢集索引及覆蓋索引等話題。
第三部分根據上面的理論基礎,討論MySQL中高效能使用索引的策略。
資料結構及演算法基礎索引的本質
MySQL官方對索引的定義為:索引(Index)是協助MySQL高效擷取資料的資料結構。提取句子主幹,就可以得到索引的本質:索引是資料結構。
我們知道,資料庫查詢是資料庫的最主要功能之一。我們都希望查詢資料的速度能儘可能的快,因此資料庫系統的設計者會從查詢演算法的角度進行最佳化。最基本的查詢演算法當然是順序尋找(linear search),這種複雜度為O(n)的演算法在資料量很大時顯然是糟糕的,好在電腦科學的發展提供了很多更優秀的尋找演算法,例如二分尋找(binary search)、二叉樹尋找(binary tree search)等。如果稍微分析一下會發現,每種尋找演算法都只能應用於特定的資料結構之上,例如二分尋找要求被檢索資料有序,而二叉樹尋找只能應用於二叉尋找樹上,但是資料本身的組織圖不可能完全滿足各種資料結構(例如,理論上不可能同時將兩列都按順序進行組織),所以,在資料之外,資料庫系統還維護著滿足特定尋找演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現進階尋找演算法。這種資料結構,就是索引。
http://gyjkyy.51sole.com/
http://gyjk.b2b168.com/
http://www.wenbing.cn/gyjk
MySQL索引背後的資料結構及演算法原理