聊聊 Mysql 索引和 redis 跳表

2021-10-05 00:23:20 字數 1314 閱讀 3062

跳表可以簡單理解就是給鍊錶加索引,當結點數量多的時候,這種新增索引的方式,會使查詢效率提高的非常明顯。

跳表這個動態資料結構,不僅支援查詢操作,還支援動態的插入、刪除操作,而且插入、刪除操作的時間複雜度也是 ○(㏒n)。

對於單純的單鏈表,需要遍歷每個結點來找到插入的位置。但是對於跳表來說,因為其查詢某個結點的時間複雜度是 ○(㏒n),所以這裡查詢某個資料應該插入的位置,時間複雜度也是 ○(㏒n)。

1.b 樹,每個節點都儲存 key 和 data,所有節點組成這棵樹,並且葉子節點指標為 null,葉子結點不包含任何關鍵字資訊。

2.b + 樹,所有的葉子結點中包含了全部關鍵字的資訊,及指向含有這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大的順序鏈結,所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。(而 b 樹的非終節點也包含需要查詢的有效資訊)

3.b 和 b + 樹的區別在於,b + 樹的非葉子結點只包含導航資訊,不包含實際的值,所有的葉子結點和相連的節點使用鍊錶相連,便於區間查詢和遍歷。

b+樹的優勢:

1.b + 的磁碟讀寫代價更低

2.b+tree 的查詢效率更加穩定

3. 便於區間查詢

redis 使用跳表不用 b + 數的原因是:redis 是記憶體資料庫,而 b + 樹純粹是為了 mysql 這種 io 資料庫準備的。b + 樹的每個節點的數量都是乙個 mysql 分割槽頁的大小

redis 中的有序集合是通過跳表來實現的,嚴格點講,還用到了雜湊表(關於雜湊表),如果檢視 redis 開發手冊,會發現 redis 中的有序集合支援的核心操作主要有下面這幾個:

其中,插入、查詢、刪除以及迭代輸出有序序列這幾個操作,紅黑樹也能完成,時間複雜度和跳表是一樣的,但是,按照區間來查詢資料這個操作,紅黑樹的效率沒有跳表高。

對於按照區間查詢資料這個操作,跳表可以做到 ○(㏒n) 的時間複雜度定位區間的起點,然後在原始鍊錶中順序往後遍歷就可以了。這樣做非常高效。

當然,還有其他原因,比如,跳表**更容易實現,可讀性好不易出錯。跳表更加靈活,可以通過改變索引構建策略,有效平衡執行效率和記憶體消耗

參考:

聊聊MongoDB MongoDB索引介紹分享

mongodb中的索引其實類似於關係型資料庫,都是為了提高查詢和排序的效率的,並且實現原理也基本一致。由於集合中的鍵 字段 可以是普通資料型別,也可以是子文件。mongodb可以在各種型別的鍵上建立索引。db.testcollection.ensureindex unique ture db.myc...

mysql索引要素 mysql索引和索引的原理

首先為什麼要加索引?資料庫伺服器有兩種儲存介質,我們需要把索引放到硬碟上,在硬碟上進行查詢時會產生i o 操作 我們通過索引來查詢某 資料的時候,需要計算產 的磁碟 i o 次數,當磁碟 i o 次數越多,所消耗的時間也就越 如果我們能讓索引的資料結構儘量減少硬碟的 i o操作,所消耗的時間也就越 ...

mysql索引和事務 MySql索引和事務

mysqlde 索引 目的 是為了加快查詢的速度,避免順序查詢,但是拖慢了插入和刪除的速度.應用在在經常查詢,很少少出插入的場景中.結構 b 樹,n叉搜尋樹,使用鏈式的結構把每一層的節點連線在一起,葉子節點中儲存資料,非葉子節點輔助查詢.主鍵索引和其他索引的不一樣 主鍵索引葉子節點儲存一條一條的資料...