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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 跳表 b 树_简单谈谈Mysql索引与redis跳表

發(fā)布時間:2025/3/11 数据库 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 跳表 b 树_简单谈谈Mysql索引与redis跳表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

摘要

面試時,交流有關mysql索引問題時,發(fā)現(xiàn)有些人能夠濤濤不絕的說出B+樹和B樹,平衡二叉樹的區(qū)別,卻說不出B+樹和hash索引的區(qū)別。這種一看就知道是死記硬背,沒有理解索引的本質(zhì)。本文旨在剖析這背后的原理,歡迎留言探討

問題

如果對以下問題感到困惑或一知半解,請繼續(xù)看下去,相信本文一定會對你有幫助

mysql 索引如何實現(xiàn)

mysql 索引結構B+樹與hash有何區(qū)別。分別適用于什么場景

數(shù)據(jù)庫的索引還能有其他實現(xiàn)嗎

redis跳表是如何實現(xiàn)的

跳表和B+樹,LSM樹有和區(qū)別呢

解析

首先為什么要把mysql索引和redis跳表放在一起討論呢,因為他們解決的都是同一種問題,用于解決數(shù)據(jù)集合的查找問題,即根據(jù)指定的key,快速查到它所在的位置(或者對應的value)

當你站在這個角度去思考問題時,還會不知道B+樹索引和hash索引的區(qū)別嗎

數(shù)據(jù)集合的查找問題

現(xiàn)在我們將問題領域邊界劃分清楚了,就是為了解決數(shù)據(jù)集合的查找問題。這一塊需要考慮哪些問題呢

需要支持哪些查找方式,單key/多key/范圍查找,

插入/刪除效率

查找效率(即時間復雜度)

存儲大小(空間復雜度)

我們看下幾種常用的查找結構

hash

hash是key,value形式,通過一個散列函數(shù),能夠根據(jù)key快速找到value

B+樹

B+樹是在平衡二叉樹基礎上演變過來,為什么我們在算法課上沒學到B+樹和跳表這種結構呢。因為他們都是從工程實踐中得到,在理論的基礎上進行了妥協(xié)。

B+樹首先是有序結構,為了不至于樹的高度太高,影響查找效率,在葉子節(jié)點上存儲的不是單個數(shù)據(jù),而是一頁數(shù)據(jù),提高了查找效率,而為了更好的支持范圍查詢,B+樹在葉子節(jié)點冗余了非葉子節(jié)點數(shù)據(jù),為了支持翻頁,葉子節(jié)點之間通過指針連接。

跳表

跳表是在鏈表的基礎上進行擴展的,為的是實現(xiàn)redis的sorted set數(shù)據(jù)結構。 level0: 是存儲原始數(shù)據(jù)的,是一個有序鏈表,每個節(jié)點都在鏈上 level0+: 通過指針串聯(lián)起節(jié)點,是原始數(shù)據(jù)的一個子集,level等級越高,串聯(lián)的數(shù)據(jù)越少,這樣可以顯著提高查找效率,

總結

數(shù)據(jù)結構

實現(xiàn)原理

key查詢方式

查找效率

存儲大小

插入、刪除效率

Hash

哈希表

支持單key

接近O(1)

小,除了數(shù)據(jù)沒有額外的存儲

O(1)

B+樹

平衡二叉樹擴展而來

單key,范圍,分頁

O(Log(n)

除了數(shù)據(jù),還多了左右指針,以及葉子節(jié)點指針

O(Log(n),需要調(diào)整樹的結構,算法比較復雜

跳表

有序鏈表擴展而來

單key,分頁

O(Log(n)

除了數(shù)據(jù),還多了指針,但是每個節(jié)點的指針小于<2,所以比B+樹占用空間小

O(Log(n),只用處理鏈表,算法比較簡單

對LSM結構感興趣的可以看下cassandra vs mongo (1)存儲引擎

cassandra vs mongo (1)存儲引擎

概括

存儲引擎:

B-Tree

緩存管理

緩存管理的核心在于置換算法,置換算法常見的有FIFO(First In First Out),LRU(Least Recently Used)。關系型數(shù)據(jù)庫在LRU的基礎上,進行了改進,主要使用LIRS(Low Inter-reference Recency Set)

將緩存分為兩級,第一次采用LRU,最近被使用到的數(shù)據(jù)會進第一級,如果數(shù)據(jù)在較短時間內(nèi)被訪問了兩次或以上,則成為熱點數(shù)據(jù),進入第二級。避免了進行全表掃描的時候,可能會將緩存中的大量熱點數(shù)據(jù)替換掉。

LSM

Log-Structured Merge Tree:結構化合并樹,核心思想就是不將數(shù)據(jù)立即從內(nèi)存中寫入到磁盤,而是先保存在內(nèi)存中,積累了一定量后再刷到磁盤中

LSM VS B-Tree

LSM在B-Tree的基礎上為了獲取更好的寫性能而犧牲了部分的讀性能,同時利用其它的實現(xiàn)來彌補讀性能,比如boom-filter.

1.寫

B樹的寫入,是首先找到對應的塊位置,然后將新數(shù)據(jù)插入。隨著寫入越來越多,為了維護B樹結構,節(jié)點得分裂。這樣插入數(shù)據(jù)的隨機寫概率就會增大,性能會減弱。

LSM 則是在內(nèi)存中形成小的排好序的樹,然后flush到磁盤的時候不斷的做merge.因為寫入都是內(nèi)存寫,不寫磁盤,所以寫會很高效。

2.讀

B樹從根節(jié)點開始二分查詢直到葉子節(jié)點,每次讀取一個節(jié)點,如果對應的頁面不在內(nèi)存中,則讀取磁盤,緩存數(shù)據(jù)。

LSM樹整個結構不是有序的,所以不知道數(shù)據(jù)在什么地方,需要從每個小的有序結構中做二分查詢,找到了就返回,找不到就繼續(xù)找下一個有序結構。所以說LSM犧牲了讀性能。但是LSM之所以能夠作為大規(guī)模數(shù)據(jù)存儲系統(tǒng)在于讀性能可以通過其他方式來提高,比如讀取性能更多的依賴于內(nèi)存/緩存命中率而不是磁盤讀取。

Cassandra

Cassandra是一個寫性能優(yōu)于讀性能的NoSql數(shù)據(jù)庫,寫性能好一個原因在于選擇了LSM存儲引擎。

Mongo

MMAPv1

Mongo 3.2以前默認使用MMAPv1存儲引擎,是基于B-Tree類型的。

邊界(padding)

MMAPv1 存儲引擎使用一個叫做”記錄分配”的過程來為document存儲分配磁盤空間。MongoDB與Cassandra不同的是,需要去更新原有的document。如果原有的document空間不足,則需要將這個document移動到新的位置,更新對應的index。這樣就會導致一些不必要的更新,和數(shù)據(jù)碎片。

為了避免出現(xiàn)上述情況,就有了邊界的概念,就是為document預分配空間。但是這樣就有可能造成資源的浪費。mongo 按照64M,128M,256M…2G的2的冥次方遞增策略預分配,最大2G。在數(shù)據(jù)量小的情況下問題并不明顯,但是當達到2G時,磁盤占用量大的問題就出來了。

同樣這一點和關系型數(shù)據(jù)庫也不一樣,關系型數(shù)據(jù)庫對于長記錄數(shù)據(jù)會分開存儲。

MMAPv1使用collection級別的鎖,即一個collecion增,刪,改一次只能有一個。在并發(fā)操作時,就會造成等待。

WiredTiger

3.2及其以后的默認存儲引擎,同樣是基于B-Tree的。采用了lock-free,風險指針等并發(fā)技術,使得在多核機器上工作的更好。

鎖級別為document。并且引入了compression,減少了磁盤占用。

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:新手學習MySQL索引

由不同的索引更新解決MySQL死鎖套路

通過唯一索引S鎖與X鎖來了解MySQL死鎖套路

分享幾道關于MySQL索引的重點面試題

Mysql中的索引精講

MySQL學習(七):Innodb存儲引擎索引的實現(xiàn)原理詳解

使用shell腳本來給mysql加索引的方法

MySQL批量插入和唯一索引問題的解決方法

高效利用mysql索引指南

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結

以上是生活随笔為你收集整理的mysql 跳表 b 树_简单谈谈Mysql索引与redis跳表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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