聊聊Mysql索引和redis跳錶

摘要

面試時,交流有關mysql索引問題時,發現有些人可以濤濤不絕的說出B+樹和B樹,平衡二叉樹的區別,卻說不出B+樹和hash索引的區別。這種一看就知道是死記硬背,沒有理解索引的本質。本文旨在剖析這背後的原理,歡迎留言探討html

問題

若是對如下問題感到困惑或只知其一;不知其二,請繼續看下去,相信本文必定會對你有幫助mysql

  • mysql 索引如何實現
  • mysql 索引結構B+樹與hash有何區別。分別適用於什麼場景
  • 數據庫的索引還能有其餘實現嗎
  • redis跳錶是如何實現的
  • 跳錶和B+樹,LSM樹有和區別呢

解析

首先爲何要把mysql索引和redis跳錶放在一塊兒討論呢,由於他們解決的都是同一種問題,用於解決數據集合的查找問題,即根據指定的key,快速查到它所在的位置(或者對應的value)面試

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

數據集合的查找問題

如今咱們將問題領域邊界劃分清楚了,就是爲了解決數據集合的查找問題。這一塊須要考慮哪些問題呢算法

  1. 須要支持哪些查找方式,單key/多key/範圍查找,
  2. 插入/刪除效率
  3. 查找效率(即時間複雜度)
  4. 存儲大小(空間複雜度)

咱們看下幾種經常使用的查找結構sql

hash 在這裏插入圖片描述數據庫

hash是key,value形式,經過一個散列函數,可以根據key快速找到value數據結構

B+樹 在這裏插入圖片描述函數

B+樹是在平衡二叉樹基礎上演變過來,爲何咱們在算法課上沒學到B+樹和跳錶這種結構呢。由於他們都是從工程實踐中獲得,在理論的基礎上進行了妥協。mysql索引

B+樹首先是有序結構,爲了避免至於樹的高度過高,影響查找效率,在葉子節點上存儲的不是單個數據,而是一頁數據,提升了查找效率,而爲了更好的支持範圍查詢,B+樹在葉子節點冗餘了非葉子節點數據,爲了支持翻頁,葉子節點之間經過指針鏈接。

跳錶 在這裏插入圖片描述

跳錶是在鏈表的基礎上進行擴展的,爲的是實現redis的sorted set數據結構。 level0: 是存儲原始數據的,是一個有序鏈表,每一個節點都在鏈上 level0+: 經過指針串聯起節點,是原始數據的一個子集,level等級越高,串聯的數據越少,這樣能夠顯著提升查找效率,

總結

數據結構 實現原理 key查詢方式 查找效率 存儲大小 插入、刪除效率
Hash 哈希表 支持單key 接近O(1) 小,除了數據沒有額外的存儲 O(1)
B+樹 平衡二叉樹擴展而來 單key,範圍,分頁 O(Log(n) 除了數據,還多了左右指針,以及葉子節點指針 O(Log(n),須要調整樹的結構,算法比較複雜
跳錶 有序鏈表擴展而來 單key,分頁 O(Log(n) 除了數據,還多了指針,可是每一個節點的指針小於<2,因此比B+樹佔用空間小 O(Log(n),只用處理鏈表,算法比較簡單

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

有用點個贊,謝謝 在這裏插入圖片描述

參考

https://www.cnblogs.com/Elliott-Su-Faith-change-our-life/p/7545940.html

相關文章
相關標籤/搜索