MySQL索引背后的數據結構及算法原理
寫在前面的話
在編程領域有一句人盡皆知的法則“程序 = 數據結構 + 算法”,我個人是不太贊同這句話(因為我覺得程序不僅僅是數據結構加算法),但是在日常的學習和工作中我確認深深感受到數據結構和算法的重要性,很多東 西,如果你愿意稍稍往深處挖一點,那么撲面而來的一定是各種數據結構和算法知識。例如幾乎每個程序員都要打交道的數據庫,如果僅僅是用來存?zhèn)€數據、建建 表、建建索引、做做增刪改查,那么也許覺得數據結構和這東西沒什么關系。不過要是哪天心血來潮,想知道的多一點,想研究一下如何優(yōu)化數據庫,那么一定避免 不了研究索引的原理,如果想要真正明白索引是怎么工作的,如何合理的使用索引以優(yōu)化數據庫,那么就免不了糾結于一堆數據結構與算法之間了。所以,如果說 “程序的核心基礎 = 數據結構 + 算法”我是十分贊同的,而一個想成為高手的程序員,一定會去學習程序的核心基礎。
好吧,說了這么 多,其實我的意思是如果想把數據庫索引學個明明白白,就必須將數據結構和算法作為切入點去學習,遺憾的是我目前還沒有在網上找到從原理層面去介紹數據庫索 引的資料(這里僅指在通俗資料領域沒找到,不包括學術論文),倒不是說沒有高水平的程序員,就只在我們公司范圍內能把這一點講透徹講明白的數據庫大牛也海 了去了,只是由于工作的忙碌和個人興趣原因,這些大牛們沒有時間或沒有興趣去寫這方面的文章。由于工作的需要,我這個半桶水的程序員這段時間也草草研究一 些關于MySQL數據庫索引的東西,雖然對這方面的理解相比那些大牛差的太遠了,不過這里我還是將這些淺薄的知識總結成文吧。
摘要
本文以MySQL數據庫為研究對象,討論與數據庫索引相關的一些話題。特別需要說明的是,MySQL支持諸多存儲引擎, 而各種存儲引擎對索引的支持也各不相同,因此MySQL數據庫支持多種索引類型,如BTree索引,哈希索引,全文索引等等。為了避免混亂,本文將只關注 于BTree索引,因為這是平常使用MySQL時主要打交道的索引,至于哈希索引和全文索引本文暫不討論。
文章主要內容分為三個部分。
***部分主要從數據結構及算法理論層面討論MySQL數據庫索引的數理基礎。
第二部分結合MySQL數據庫中MyISAM和InnoDB數據存儲引擎中索引的架構實現討論聚集索引、非聚集索引及覆蓋索引等話題。
第三部分根據上面的理論基礎,討論MySQL中高性能使用索引的策略。
內容鏈接
索引的本質
B-Tree和B+Tree
為什么實用B-Tree(B+Tree)
MyISAM索引實現
InnoDB索引實現
示例數據庫
最左前綴原理與相關優(yōu)化
索引選擇性與前綴索引
InnoDB的主鍵選擇與插入優(yōu)化
【編輯推薦】