天天看點

簡單了解B+樹和密集、稀疏索引

B+樹是B樹的變體,定義基本與B樹相同,除了:

  1. 非葉子節點的子樹指針與關鍵字個數相同;
  2. 非葉子節點的子樹指針P[i],指向關鍵字值[K[i], K[i+1])的子樹,這裡必須是小于K[i+1]的,(也有的說是不一定是大于等于K[i]);
  3. 非葉子節點隻用來存儲索引,葉子節點才是存儲資料的;(也就是說所有的節點都是需要從根節點到葉子節點,B+樹也會更矮)
  4. 所有葉子節點均有一個鍊指針指向下一個葉子節點;(B+樹的葉子節點都是按從小到大排序的,能友善我們做範圍統計,無需再回到葉子節點做搜尋,能橫向跨子樹做統計)
簡單了解B+樹和密集、稀疏索引

B+樹更适合用來做存儲索引

  1. B+樹的磁盤讀寫代價更低;(B+樹隻存儲索引,不存放資料,讀入磁盤的時候一次IO能讀取的關鍵字資訊就越多,是以相對而言IO的查詢次數就降低了)
  2. B+數的查詢效率更加穩定;(由于B+樹隻存儲索引,葉子節點才存儲資料,是以B+樹查詢都是要從根節點走到子節點的,是以查詢效率基本相同)
  3. B+樹更有利于對資料庫的掃描;(B樹在提高了IO性能的同時并沒有解決元素周遊效率低下的問題,而B+樹隻需要周遊葉子節點就可以解決元素周遊的問題,因為B+樹的葉子節點連在一起,是以做周遊查詢的時候效率更高)

Hash索引

簡單了解即可

簡單了解B+樹和密集、稀疏索引

BitMap索引

位圖索引:

  适用于表中的字段隻有幾種值的時候,例如要表示性别:男、女。

  oracle支援位圖索引,該索引不是主流索引;

  統計會很快,但是鎖的力度很大,當嘗試新增或修改或删除的時候,同一位圖的資料都會被鎖住,是以不适合高并發的系統。

密集索引與稀疏索引

簡單了解B+樹和密集、稀疏索引
簡單了解B+樹和密集、稀疏索引

InnoDB使用的是密集索引,資料和索引是存在一個表内的;MyISAM則是稀疏索引,索引與資料是分别存在兩個表中的。

由上圖可知,當進行主索引的時候都是一次查詢,而進行輔助索引的時候密集索引的InnoDB需要進行二次查詢,而稀疏索引依舊是一次查詢即可。

一個表有且隻有一個密集索引。

兩個的表結構都是存儲在*.frm中;

MyISAM索引存在*.MYI中,資料存在*.MYD中;

InnoDB索引和資料都存在*.ibd中;

是以密集索引的主索引會比稀疏索引的主索引查詢會快很多,而輔助索引的查詢則是稀疏索引較快。