天天看點

MySQL資料庫的索引簡介

我們平時所說的索引,如果沒有特别指明,都是指B+樹(多路搜尋樹,并不一定是二叉的)結構組織的索引,其中聚集索引、複合索引、字首索引、唯一索引預設都是使用B+tree樹索引,統稱為索引!

1.MySQL 索引

MySQL索引的建立對于MySQL的高效運作是很重要的,索引可以大大提高MySQL的檢索速度。

  • 打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。
  • 拿漢語字典的目錄頁(索引)打比方,我們可以按拼音、筆畫、偏旁部首等排序的目錄(索引)快速查找到需要的字。

索引分單列索引群組合索引。單列索引,即一個索引隻包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。

建立索引時,你需要確定該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。

實際上,索引也是一張表,該表儲存了主鍵與索引字段,并指向實體表的記錄。

上面都在說使用索引的好處,但過多的使用索引将會造成濫用。是以索引也會有它的缺點:​

​雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。​

​因為更新表時,MySQL不僅要儲存資料,還要儲存一下索引檔案。建立索引會占用磁盤空間的索引檔案。

2.索引

索引:二叉樹

快速查找

優勢:

  1. 快速查詢資料,降低資料庫的IO成本
  2. 通過索引列對資料進行排序,降低資料排序的成本,降低CPU的消耗

劣勢:

  1. 實際上索引也是一張表,該表中儲存了主鍵與索引字段,并指向實體類的記錄,是以索引列也是要占用空間的。
  2. 雖然索引大大提高了查詢效率,同時卻也降低更新表的速度,如對表進行insert,update,delete,因為更新表時,mysql不僅儲存資料,還要儲存一下索引檔案每次更新添加了索引列的字段,都會調整因為更新所帶來的鍵值變化後的索引資訊。

3.索引結構

MySQL目前提供了以下四種索引:

  1. BTREE索引:最常見的索引類型,大部分索引都支援B樹索引
  2. HASH索引:隻有Memory引擎支援,使用場景最簡單。
  3. R-tree索引(空間索引):空間索引是MyISAM引擎的一個特助索引類型,主要用于地理空間資料類型,通常使用較少,不做特别介紹。
  4. Full-text(全文索引):全文索引也是MyISAm的一個特殊索引類型,主要用于全文索引,InnoDB從Mysql5.6版本開始支援全文索引

4.BTREE樹和二叉樹相比

查詢資料的效率更高,因為對于相同的資料量來說,BTREE層級結構比二叉樹小,是以搜尋速度更快。

5.BTree樹與B+Tree

BTREE又叫多路平衡搜尋樹,一棵m叉的BTree特性如下:

  1. 樹中每個節點最多包含m個孩子
  2. 除根節點與葉子節點外,每個節點至少有[cell(m/2)]個孩子。
  3. 若根節點不是葉子節點,則至少有兩個孩子
  4. 所有的葉子節點都在同一層
  5. 每個非葉子節點由n個key與n+1個指針組成,其中[cell(m/2)-1]<=n<=m-1

B+Tree為BTree的變種,差別如下

  1. n叉B+Tree最多含有n個key,而BTree最多含有n-1個key
  2. B+Tree的葉子節點儲存所有的key資訊,依key大小順序排列
  3. 所有的非葉子節點都可以看做是key的索引部分

由于B+Tree隻有葉子節點儲存key資訊,查詢任何key都要從root走到葉子,是以B+Tree的查詢效率更加穩定。

MySQL中的B+Tree MySQL索引資料結構對經典的B+Tree進行了優化,在原B+Tree的基礎上, ​

​增加了指向相鄰葉子節點的連結清單指針​

​,就形成了帶有順序指針的B+Tree,提高區間通路性能。

記錄時間:2021年1月6日