日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构行编辑成簇 c语言,索引的数据结构及底层存储

發(fā)布時(shí)間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构行编辑成簇 c语言,索引的数据结构及底层存储 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

索引是幫助數(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。