数据结构行编辑成簇 c语言,索引的数据结构及底层存储
索引是幫助數(shù)據(jù)庫(kù)高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)
索引的數(shù)據(jù)結(jié)構(gòu)
1.hash表
a.利用hash存儲(chǔ)的話需要將所有的數(shù)據(jù)文件添加到內(nèi)存,比較耗費(fèi)內(nèi)存空間
b.hash表存儲(chǔ)的是無(wú)序數(shù)據(jù),范圍查找的時(shí)候需要挨個(gè)進(jìn)行遍歷,比較耗費(fèi)時(shí)間。
2.二叉樹
二叉樹規(guī)定左子樹必須小于根節(jié)點(diǎn),右子樹必須大于根節(jié)點(diǎn),可能會(huì)導(dǎo)致右子樹變成一條鏈表,對(duì)提升查詢效率沒(méi)有幫助。
3.平衡樹(AVL樹)
AVL樹是一顆嚴(yán)格意義上的平衡樹,它要求最高子樹和最低子樹的高度之差不超過(guò)1,因此在進(jìn)行元素插入的時(shí)候,會(huì)進(jìn)行1到n次的旋轉(zhuǎn),嚴(yán)重影響插入的效率。
4.紅黑樹
紅黑樹是基于AVL樹的一個(gè)升級(jí),損失了部分查詢的性能,來(lái)提升插入的性能,在紅黑樹中,最高子樹不能超過(guò)最低子樹的2倍,在插入的時(shí)候,不需要進(jìn)行N多次的旋轉(zhuǎn)操作,而且加入了變色的特性,來(lái)滿足插入和查詢性能的平衡。ps:二叉樹及其變種的其他樹都不能支撐索引的需求,原因是其插入數(shù)據(jù)的性能比較低,并且樹的深度無(wú)法控制,都會(huì)因?yàn)闃涞纳疃冗^(guò)深而造成io的次數(shù)變多,影響讀取數(shù)據(jù)的效率。
5.B-Tree
B樹的特點(diǎn):
1.所有鍵值分布在整顆樹上
2.搜索可能在非葉子節(jié)點(diǎn)上結(jié)束,在關(guān)鍵字全集內(nèi)做一次查找,性能逼近二分查找
3.節(jié)點(diǎn)中的數(shù)據(jù)索引從左到右遞增排列
缺點(diǎn):每個(gè)節(jié)點(diǎn)同時(shí)包含了key和data,而每個(gè)頁(yè)存儲(chǔ)空間是有限的,
如果data比較大的話會(huì)導(dǎo)致每個(gè)節(jié)點(diǎn)存儲(chǔ)的元素?cái)?shù)量變小。
當(dāng)存儲(chǔ)量變大時(shí),會(huì)導(dǎo)致深度變大,增大磁盤io次數(shù),進(jìn)而影響查詢性能。
6.B+Tree
B+Tree是在B-Tree的基礎(chǔ)之上做的一種優(yōu)化:
1.B+Tree的非葉子節(jié)點(diǎn)只存儲(chǔ)索引,不存儲(chǔ)data,使非葉子節(jié)點(diǎn)可以包含更多的節(jié)點(diǎn),這樣有兩個(gè)好處,一是大大降低了樹的高度,二是將數(shù)據(jù)范圍變成多個(gè)區(qū)間,增加了檢索的效率。
2.葉子節(jié)點(diǎn)存儲(chǔ)所有的索引和data,而且所有的葉子節(jié)點(diǎn)相互連接,形成了一種鏈?zhǔn)浇Y(jié)構(gòu),范圍查詢性能更高。ps:索引的從磁盤到內(nèi)存的load過(guò)程中會(huì)產(chǎn)生磁盤I/O消耗,相對(duì)于內(nèi)存讀取,I/O存取的消耗要高好幾個(gè)數(shù)量級(jí),所以評(píng)價(jià)一個(gè)數(shù)據(jù)結(jié)構(gòu)作為索引的優(yōu)劣最重要的指標(biāo)就是在查找過(guò)程中磁盤I/O操作次數(shù)。換句話說(shuō),索引的結(jié)構(gòu)組織要盡量減少查找過(guò)程中磁盤I/O的存取次數(shù)。B+Tree這種數(shù)據(jù)結(jié)構(gòu)利用了磁盤預(yù)讀原理,將每個(gè)節(jié)點(diǎn)的大小設(shè)為等于一個(gè)頁(yè),每個(gè)節(jié)點(diǎn)只需要一次I/O就可以載入,并且節(jié)點(diǎn)中的數(shù)據(jù)和索引從左到右遞增排列,符合局部性原理,所以B+Tree擁有更好的性能。
InnoDB索引實(shí)現(xiàn)
聚簇索引
在InnoDB這種存儲(chǔ)引擎下,數(shù)據(jù)和索引是放在一起的.frm存放的是表結(jié)構(gòu).ibd存放表數(shù)據(jù)和索引
ps:innoDB存儲(chǔ)引擎默認(rèn)情況下會(huì)把所有的數(shù)據(jù)文件放到表空間中,不會(huì)單獨(dú)為每一張表保存一份數(shù)據(jù)文件,如果需要將每一張表單獨(dú)使用文件保存,設(shè)置如下屬性:set gobal innodb_file_per_table=on
InnoDB--B+Tree
1.葉子節(jié)點(diǎn)直接存放索引和數(shù)據(jù)
2.InnoDB中至少有一個(gè)聚簇索引,一般會(huì)通過(guò)B+Tree對(duì)主鍵創(chuàng)建索引,如果沒(méi)有主鍵,會(huì)選擇唯一鍵,如果沒(méi)有唯一鍵,會(huì)自動(dòng)生成一個(gè)6位rowid來(lái)作為主鍵
3.在非聚簇索引中,葉子節(jié)點(diǎn)上存儲(chǔ)的是該行數(shù)據(jù)的主鍵,然后通過(guò)聚簇索引找到對(duì)應(yīng)的數(shù)據(jù),也就是要走兩次B+Tree,叫做回表
MyISAM索引實(shí)現(xiàn)
非聚簇索引
在MyISAM這種存儲(chǔ)引擎下,數(shù)據(jù)和索引文件是單獨(dú)的文件.frm存放的是表結(jié)構(gòu).MYI存放索引.MYD存放表數(shù)據(jù)
MyISAM--B+Tree
1.葉子節(jié)點(diǎn)存放索引和對(duì)應(yīng)數(shù)據(jù)的磁盤文件地址
2.MyISAM不存在回表的問(wèn)題
總結(jié)
以上是生活随笔為你收集整理的数据结构行编辑成簇 c语言,索引的数据结构及底层存储的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android常用组件,太全了
- 下一篇: 川大锦城c语言期末考试答案,四川大学《计