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