| 數(shù)據(jù)結(jié)構(gòu) | 實(shí)現(xiàn)原理 | key查詢(xún)方式 | 查找效率 | 存儲(chǔ)大小 | 插入、刪除效率 |
|---|---|---|---|---|---|
| Hash | 哈希表 | 支持單key | 接近O(1) | 小,除了數(shù)據(jù)沒(méi)有額外的存儲(chǔ) | O(1) |
| B+樹(shù) | 平衡二叉樹(shù)擴(kuò)展而來(lái) | 單key,范圍,分頁(yè) | O(Log(n) | 除了數(shù)據(jù),還多了左右指針,以及葉子節(jié)點(diǎn)指針 | O(Log(n),需要調(diào)整樹(shù)的結(jié)構(gòu),算法比較復(fù)雜 |
| 跳表 | 有序鏈表擴(kuò)展而來(lái) | 單key,分頁(yè) | O(Log(n) | 除了數(shù)據(jù),還多了指針,但是每個(gè)節(jié)點(diǎn)的指針小于2,所以比B+樹(shù)占用空間小 | O(Log(n),只用處理鏈表,算法比較簡(jiǎn)單 |
對(duì)LSM結(jié)構(gòu)感興趣的可以看下cassandra vs mongo (1)存儲(chǔ)引擎
cassandra vs mongo (1)存儲(chǔ)引擎
概括
存儲(chǔ)引擎:

B-Tree
緩存管理
緩存管理的核心在于置換算法,置換算法常見(jiàn)的有FIFO(First In First Out),LRU(Least Recently Used)。關(guān)系型數(shù)據(jù)庫(kù)在LRU的基礎(chǔ)上,進(jìn)行了改進(jìn),主要使用LIRS(Low Inter-reference Recency Set)
將緩存分為兩級(jí),第一次采用LRU,最近被使用到的數(shù)據(jù)會(huì)進(jìn)第一級(jí),如果數(shù)據(jù)在較短時(shí)間內(nèi)被訪(fǎng)問(wèn)了兩次或以上,則成為熱點(diǎn)數(shù)據(jù),進(jìn)入第二級(jí)。避免了進(jìn)行全表掃描的時(shí)候,可能會(huì)將緩存中的大量熱點(diǎn)數(shù)據(jù)替換掉。
LSM
Log-Structured Merge Tree:結(jié)構(gòu)化合并樹(shù),核心思想就是不將數(shù)據(jù)立即從內(nèi)存中寫(xiě)入到磁盤(pán),而是先保存在內(nèi)存中,積累了一定量后再刷到磁盤(pán)中
LSM VS B-Tree
LSM在B-Tree的基礎(chǔ)上為了獲取更好的寫(xiě)性能而犧牲了部分的讀性能,同時(shí)利用其它的實(shí)現(xiàn)來(lái)彌補(bǔ)讀性能,比如boom-filter.
1.寫(xiě)
B樹(shù)的寫(xiě)入,是首先找到對(duì)應(yīng)的塊位置,然后將新數(shù)據(jù)插入。隨著寫(xiě)入越來(lái)越多,為了維護(hù)B樹(shù)結(jié)構(gòu),節(jié)點(diǎn)得分裂。這樣插入數(shù)據(jù)的隨機(jī)寫(xiě)概率就會(huì)增大,性能會(huì)減弱。
LSM 則是在內(nèi)存中形成小的排好序的樹(shù),然后flush到磁盤(pán)的時(shí)候不斷的做merge.因?yàn)閷?xiě)入都是內(nèi)存寫(xiě),不寫(xiě)磁盤(pán),所以寫(xiě)會(huì)很高效。
2.讀
B樹(shù)從根節(jié)點(diǎn)開(kāi)始二分查詢(xún)直到葉子節(jié)點(diǎn),每次讀取一個(gè)節(jié)點(diǎn),如果對(duì)應(yīng)的頁(yè)面不在內(nèi)存中,則讀取磁盤(pán),緩存數(shù)據(jù)。
LSM樹(shù)整個(gè)結(jié)構(gòu)不是有序的,所以不知道數(shù)據(jù)在什么地方,需要從每個(gè)小的有序結(jié)構(gòu)中做二分查詢(xún),找到了就返回,找不到就繼續(xù)找下一個(gè)有序結(jié)構(gòu)。所以說(shuō)LSM犧牲了讀性能。但是LSM之所以能夠作為大規(guī)模數(shù)據(jù)存儲(chǔ)系統(tǒng)在于讀性能可以通過(guò)其他方式來(lái)提高,比如讀取性能更多的依賴(lài)于內(nèi)存/緩存命中率而不是磁盤(pán)讀取。
Cassandra
Cassandra是一個(gè)寫(xiě)性能優(yōu)于讀性能的NoSql數(shù)據(jù)庫(kù),寫(xiě)性能好一個(gè)原因在于選擇了LSM存儲(chǔ)引擎。
Mongo
MMAPv1
Mongo 3.2以前默認(rèn)使用MMAPv1存儲(chǔ)引擎,是基于B-Tree類(lèi)型的。
邊界(padding)
MMAPv1 存儲(chǔ)引擎使用一個(gè)叫做”記錄分配”的過(guò)程來(lái)為document存儲(chǔ)分配磁盤(pán)空間。MongoDB與Cassandra不同的是,需要去更新原有的document。如果原有的document空間不足,則需要將這個(gè)document移動(dòng)到新的位置,更新對(duì)應(yīng)的index。這樣就會(huì)導(dǎo)致一些不必要的更新,和數(shù)據(jù)碎片。
為了避免出現(xiàn)上述情況,就有了邊界的概念,就是為document預(yù)分配空間。但是這樣就有可能造成資源的浪費(fèi)。mongo 按照64M,128M,256M…2G的2的冥次方遞增策略預(yù)分配,最大2G。在數(shù)據(jù)量小的情況下問(wèn)題并不明顯,但是當(dāng)達(dá)到2G時(shí),磁盤(pán)占用量大的問(wèn)題就出來(lái)了。
同樣這一點(diǎn)和關(guān)系型數(shù)據(jù)庫(kù)也不一樣,關(guān)系型數(shù)據(jù)庫(kù)對(duì)于長(zhǎng)記錄數(shù)據(jù)會(huì)分開(kāi)存儲(chǔ)。
鎖
MMAPv1使用collection級(jí)別的鎖,即一個(gè)collecion增,刪,改一次只能有一個(gè)。在并發(fā)操作時(shí),就會(huì)造成等待。
WiredTiger
3.2及其以后的默認(rèn)存儲(chǔ)引擎,同樣是基于B-Tree的。采用了lock-free,風(fēng)險(xiǎn)指針等并發(fā)技術(shù),使得在多核機(jī)器上工作的更好。
鎖級(jí)別為document。并且引入了compression,減少了磁盤(pán)占用。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
標(biāo)簽:黔西 梅河口 駐馬店 北京 昌都 鄂爾多斯 荊門(mén) 陜西
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《簡(jiǎn)單談?wù)凪ysql索引與redis跳表》,本文關(guān)鍵詞 簡(jiǎn)單,談?wù)?Mysql,索引,與,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。