mysql数据结构参考书籍_mysql数据结构相关
數(shù)據(jù)結(jié)構(gòu)其實(shí)分2大部分:
存儲(chǔ)結(jié)構(gòu):數(shù)據(jù)根據(jù)什么規(guī)則存儲(chǔ),比如索引存儲(chǔ)的時(shí)候要根據(jù)樹的規(guī)則去存儲(chǔ)。
邏輯結(jié)構(gòu):數(shù)據(jù)本身的結(jié)構(gòu),比如索引內(nèi)部其實(shí)是一個(gè)復(fù)合結(jié)構(gòu),內(nèi)部除了自己指向的數(shù)據(jù)地址還有其他節(jié)點(diǎn)相關(guān)地址。
起初根據(jù)查找效率的需求,設(shè)計(jì)人員選擇了單獨(dú)開辟扇區(qū)用來存放索引,就好像字典的索引一個(gè)道理。
存儲(chǔ)結(jié)構(gòu)和邏輯結(jié)構(gòu)結(jié)合起來就幫助我們查找數(shù)據(jù)的時(shí)候可以盡量減少查找次數(shù)(底層就是扇區(qū)的讀取次數(shù))
二叉樹的結(jié)構(gòu)也可以幫我們形象理解索引的查找次數(shù)與普通鏈表的差別,同樣的數(shù)據(jù),普通鏈表最糟糕情況要查遍所有數(shù)據(jù)節(jié)點(diǎn),而二叉樹最多的查詢次數(shù)跟樹的層數(shù)有關(guān),明顯比鏈表要少。
平衡二叉樹是在二叉樹基礎(chǔ)上的進(jìn)一步優(yōu)化,用“平衡”形象的表述了怎樣優(yōu)化二叉樹的結(jié)構(gòu),從而優(yōu)化查詢效率。簡單說就是父節(jié)點(diǎn)要求2邊子節(jié)點(diǎn)層級(jí)要盡量一樣,最大高度差為1。
平衡二叉樹的結(jié)構(gòu)概念上很好,但是有個(gè)問題,索引結(jié)構(gòu)的改變導(dǎo)致磁盤上的索引數(shù)據(jù)也需要頻繁讀寫調(diào)整扇區(qū),這也導(dǎo)致了性能問題。
針對(duì)以上問題,設(shè)計(jì)人員又做了調(diào)整:
首先取消單獨(dú)開辟單獨(dú)block存放索引,讓數(shù)據(jù)block節(jié)點(diǎn)本身就帶索引信息,數(shù)據(jù)block節(jié)點(diǎn)本身就是索引節(jié)點(diǎn)。
每個(gè)block內(nèi)存儲(chǔ)的數(shù)據(jù)還是順序排列,能排多少個(gè)跟數(shù)據(jù)本身占用的空間有關(guān)。
一個(gè)節(jié)點(diǎn)能延伸多少個(gè)引用關(guān)系跟內(nèi)部的數(shù)據(jù)有關(guān),而不是二叉樹那樣的頂多2條線路,大致就是2個(gè)端點(diǎn)會(huì)各自延伸出一條線路,block內(nèi)部數(shù)據(jù)之間如果還能再插入數(shù)據(jù),那隨著新block的申請(qǐng),就會(huì)延伸出一個(gè)新的線路指向新的block。
block內(nèi)的數(shù)據(jù)并不是插入就不會(huì)再移動(dòng)的,而是隨著block被填滿,再插入數(shù)據(jù)的時(shí)候會(huì)先發(fā)生分裂(block內(nèi)數(shù)+新填入數(shù)據(jù)序列均分)成2個(gè)block(新申請(qǐng)一塊,再平分填入2個(gè)block),然后選一個(gè)靠中間的數(shù)據(jù)(通常是較大的那個(gè))升級(jí)到父節(jié)點(diǎn)(這里又是一個(gè)block讀寫),并且調(diào)整引用線路,如果父節(jié)點(diǎn)也填滿了,則在這一層也發(fā)生分裂并且有一個(gè)數(shù)據(jù)提升到上一級(jí)父節(jié)點(diǎn)。
以上結(jié)構(gòu)就是btree(多路查找樹)。
btree操作的特點(diǎn):
1)每次分裂都會(huì)使block留有一些空隙供下一次插入。
2)與二叉樹不同,btree的延伸是從下到上的。
btree優(yōu)點(diǎn):
1)每次調(diào)整都是局部的block讀寫,相比二叉樹效率要好一些。
2)相比二叉樹,btree的層級(jí)要更少,查詢效率要更高(block讀取次數(shù))
btree的缺陷:
因?yàn)閎tree的節(jié)點(diǎn)內(nèi)存放的是數(shù)據(jù),因此實(shí)際每個(gè)block能分出的線路是有限的。因此,設(shè)計(jì)人員又提出了b+tree。
b+tree:
b+tree的遍歷和分裂邏輯與btree一樣,最大的變化有2點(diǎn):
1)葉子節(jié)點(diǎn)只是數(shù)據(jù),非葉子節(jié)點(diǎn)只存放索引,索引點(diǎn)只保留數(shù)據(jù)的引用即可。這樣放大了索引查找的效率,又不會(huì)像二叉樹那樣多的讀寫block。查找流程上,b+tree相當(dāng)于在btree基礎(chǔ)上,多了一次查找索引指向的數(shù)據(jù)所在block。
2)葉子節(jié)點(diǎn)的數(shù)據(jù)是一個(gè)順序排列的鏈表,這樣可以方便按范圍查找。
總結(jié)
以上是生活随笔為你收集整理的mysql数据结构参考书籍_mysql数据结构相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python代码读取外部变量_关于pyt
- 下一篇: mysql 数据库 导入兼容_mysql