最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單談?wù)凪ysql索引與redis跳表

 更新時間:2019年04月16日 09:53:26   作者:stoneFang  
這篇文章主要給大家介紹了Mysql索引與redis跳表的相關(guān)資料,文中介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Mysql和redis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

摘要

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

問題

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

  • mysql 索引如何實(shí)現(xiàn)
  • mysql 索引結(jié)構(gòu)B+樹與hash有何區(qū)別。分別適用于什么場景
  • 數(shù)據(jù)庫的索引還能有其他實(shí)現(xiàn)嗎
  • redis跳表是如何實(shí)現(xiàn)的
  • 跳表和B+樹,LSM樹有和區(qū)別呢

解析

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

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

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

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

  1. 需要支持哪些查找方式,單key/多key/范圍查找,
  2. 插入/刪除效率
  3. 查找效率(即時間復(fù)雜度)
  4. 存儲大?。臻g復(fù)雜度)

我們看下幾種常用的查找結(jié)構(gòu)

hash

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

B+樹

B+樹是在平衡二叉樹基礎(chǔ)上演變過來,為什么我們在算法課上沒學(xué)到B+樹和跳表這種結(jié)構(gòu)呢。因?yàn)樗麄兌际菑墓こ虒?shí)踐中得到,在理論的基礎(chǔ)上進(jìn)行了妥協(xié)。

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

跳表

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

總結(jié)

數(shù)據(jù)結(jié)構(gòu) 實(shí)現(xiàn)原理 key查詢方式 查找效率 存儲大小 插入、刪除效率
Hash 哈希表 支持單key 接近O(1) 小,除了數(shù)據(jù)沒有額外的存儲 O(1)
B+樹 平衡二叉樹擴(kuò)展而來 單key,范圍,分頁 O(Log(n) 除了數(shù)據(jù),還多了左右指針,以及葉子節(jié)點(diǎn)指針 O(Log(n),需要調(diào)整樹的結(jié)構(gòu),算法比較復(fù)雜
跳表 有序鏈表擴(kuò)展而來 單key,分頁 O(Log(n) 除了數(shù)據(jù),還多了指針,但是每個節(jié)點(diǎn)的指針小于<2,所以比B+樹占用空間小 O(Log(n),只用處理鏈表,算法比較簡單

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

cassandra vs mongo (1)存儲引擎

概括

存儲引擎:

B-Tree

緩存管理

緩存管理的核心在于置換算法,置換算法常見的有FIFO(First In First Out),LRU(Least Recently Used)。關(guān)系型數(shù)據(jù)庫在LRU的基礎(chǔ)上,進(jìn)行了改進(jìn),主要使用LIRS(Low Inter-reference Recency Set)
將緩存分為兩級,第一次采用LRU,最近被使用到的數(shù)據(jù)會進(jìn)第一級,如果數(shù)據(jù)在較短時間內(nèi)被訪問了兩次或以上,則成為熱點(diǎn)數(shù)據(jù),進(jìn)入第二級。避免了進(jìn)行全表掃描的時候,可能會將緩存中的大量熱點(diǎn)數(shù)據(jù)替換掉。

LSM

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

LSM VS B-Tree

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

1.寫

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

LSM 則是在內(nèi)存中形成小的排好序的樹,然后flush到磁盤的時候不斷的做merge.因?yàn)閷懭攵际莾?nèi)存寫,不寫磁盤,所以寫會很高效。

2.讀

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

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

Cassandra

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

Mongo

MMAPv1

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

邊界(padding)

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

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

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


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

WiredTiger

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

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

總結(jié)

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

相關(guān)文章

  • 詳解MySQL到SelectDB的實(shí)時同步策略

    詳解MySQL到SelectDB的實(shí)時同步策略

    MySQL?到?SelectDB?的實(shí)時數(shù)據(jù)同步技術(shù),通過?NineData?的數(shù)據(jù)復(fù)制控制臺,僅需輕點(diǎn)鼠標(biāo),即可輕松完成?MySQL?到?SelectDB?的同步任務(wù)配置,這篇文章主要介紹了MySQL到SelectDB的實(shí)時同步策略,需要的朋友可以參考下
    2023-09-09
  • MySQL數(shù)據(jù)庫學(xué)習(xí)之查詢操作詳解

    MySQL數(shù)據(jù)庫學(xué)習(xí)之查詢操作詳解

    這篇文章主要為大家詳細(xì)介紹一下MySQL數(shù)據(jù)庫中一些查詢操作,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)MySQL有一定幫助,需要的可以參考一下
    2022-07-07
  • mysql innodb 異常修復(fù)經(jīng)驗(yàn)分享

    mysql innodb 異常修復(fù)經(jīng)驗(yàn)分享

    這篇文章主要介紹了mysql innodb 異常修復(fù)經(jīng)驗(yàn)分享,需要的朋友可以參考下
    2017-04-04
  • MySQL如何生成自增的流水號

    MySQL如何生成自增的流水號

    這篇文章主要介紹了MySQL如何生成自增的流水號問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 一篇文章帶你了解MySQL數(shù)據(jù)庫約束

    一篇文章帶你了解MySQL數(shù)據(jù)庫約束

    數(shù)據(jù)庫中要管理很多數(shù)據(jù),但是這些數(shù)據(jù)是否正確、是否非法,光靠人力來檢驗(yàn)是遠(yuǎn)遠(yuǎn)不夠的,因此我們想讓數(shù)據(jù)庫擁有豐富的檢驗(yàn)和校驗(yàn)?zāi)芰?所以便引入了約束,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫約束的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • DBeaver如何實(shí)現(xiàn)導(dǎo)入excel中的大量數(shù)據(jù)

    DBeaver如何實(shí)現(xiàn)導(dǎo)入excel中的大量數(shù)據(jù)

    使用DBeaver導(dǎo)入Excel數(shù)據(jù)需先將文件轉(zhuǎn)換為CSV格式,詳細(xì)步驟包括:將Excel文件另存為CSV,確保列名與數(shù)據(jù)庫表字段對應(yīng),然后在DBeaver中創(chuàng)建表和導(dǎo)入CSV文件,注意選擇正確的編碼格式以防中文亂碼
    2024-10-10
  • Kettle的MySQL數(shù)據(jù)源版本問題及解決

    Kettle的MySQL數(shù)據(jù)源版本問題及解決

    這篇文章主要介紹了Kettle的MySQL數(shù)據(jù)源版本問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • MySQL表的內(nèi)外連接和視圖使用實(shí)戰(zhàn)練習(xí)

    MySQL表的內(nèi)外連接和視圖使用實(shí)戰(zhàn)練習(xí)

    這篇文章主要給大家介紹了關(guān)于MySQL表的內(nèi)外連接和視圖使用的相關(guān)資料,MySQL的內(nèi)外連接查詢是用于將兩個或多個表中的數(shù)據(jù)進(jìn)行關(guān)聯(lián)查詢的一種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 十個節(jié)省時間的MySQL命令小結(jié)

    十個節(jié)省時間的MySQL命令小結(jié)

    編者在工作中積累起來了一些MySQL命令行客戶端技巧,這些技巧或多或少會幫助您節(jié)省大量的時間。
    2011-03-03
  • MySQL?JSON類型數(shù)據(jù)查詢方法

    MySQL?JSON類型數(shù)據(jù)查詢方法

    這篇文章主要介紹了MySQL?JSON類型數(shù)據(jù)查詢,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-04-04

最新評論

土默特右旗| 孟州市| 竹北市| 北海市| 龙川县| 宜春市| 达尔| 罗源县| 永清县| 峨眉山市| 石城县| 自治县| 莫力| 沁源县| 泸溪县| 乡城县| 黑山县| 温州市| 壤塘县| 乡城县| 新化县| 蕉岭县| 梧州市| 齐河县| 邹城市| 五华县| 淮滨县| 长阳| 普洱| 临城县| 纳雍县| 望城县| 驻马店市| 永新县| 呼图壁县| 灌云县| 乌鲁木齐县| 宁河县| 建水县| 卓资县| 苍梧县|