我們平時所說的索引,如果沒有特别指明,都是指B+樹(多路搜尋樹,并不一定是二叉的)結構組織的索引,其中聚集索引、複合索引、字首索引、唯一索引預設都是使用B+tree樹索引,統稱為索引!
1.MySQL 索引
MySQL索引的建立對于MySQL的高效運作是很重要的,索引可以大大提高MySQL的檢索速度。
-
- 打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。
- 拿漢語字典的目錄頁(索引)打比方,我們可以按拼音、筆畫、偏旁部首等排序的目錄(索引)快速查找到需要的字。
索引分單列索引群組合索引。單列索引,即一個索引隻包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。
建立索引時,你需要確定該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
實際上,索引也是一張表,該表儲存了主鍵與索引字段,并指向實體表的記錄。
上面都在說使用索引的好處,但過多的使用索引将會造成濫用。是以索引也會有它的缺點:
雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。
因為更新表時,MySQL不僅要儲存資料,還要儲存一下索引檔案。建立索引會占用磁盤空間的索引檔案。
2.索引
索引:二叉樹
快速查找
優勢:
-
- 快速查詢資料,降低資料庫的IO成本
- 通過索引列對資料進行排序,降低資料排序的成本,降低CPU的消耗
劣勢:
-
- 實際上索引也是一張表,該表中儲存了主鍵與索引字段,并指向實體類的記錄,是以索引列也是要占用空間的。
- 雖然索引大大提高了查詢效率,同時卻也降低更新表的速度,如對表進行insert,update,delete,因為更新表時,mysql不僅儲存資料,還要儲存一下索引檔案每次更新添加了索引列的字段,都會調整因為更新所帶來的鍵值變化後的索引資訊。
3.索引結構
MySQL目前提供了以下四種索引:
-
- BTREE索引:最常見的索引類型,大部分索引都支援B樹索引
- HASH索引:隻有Memory引擎支援,使用場景最簡單。
- R-tree索引(空間索引):空間索引是MyISAM引擎的一個特助索引類型,主要用于地理空間資料類型,通常使用較少,不做特别介紹。
- Full-text(全文索引):全文索引也是MyISAm的一個特殊索引類型,主要用于全文索引,InnoDB從Mysql5.6版本開始支援全文索引
4.BTREE樹和二叉樹相比
查詢資料的效率更高,因為對于相同的資料量來說,BTREE層級結構比二叉樹小,是以搜尋速度更快。
5.BTree樹與B+Tree
BTREE又叫多路平衡搜尋樹,一棵m叉的BTree特性如下:
-
- 樹中每個節點最多包含m個孩子
- 除根節點與葉子節點外,每個節點至少有[cell(m/2)]個孩子。
- 若根節點不是葉子節點,則至少有兩個孩子
- 所有的葉子節點都在同一層
- 每個非葉子節點由n個key與n+1個指針組成,其中[cell(m/2)-1]<=n<=m-1
B+Tree為BTree的變種,差別如下
-
- n叉B+Tree最多含有n個key,而BTree最多含有n-1個key
- B+Tree的葉子節點儲存所有的key資訊,依key大小順序排列
- 所有的非葉子節點都可以看做是key的索引部分
由于B+Tree隻有葉子節點儲存key資訊,查詢任何key都要從root走到葉子,是以B+Tree的查詢效率更加穩定。
MySQL中的B+Tree MySQL索引資料結構對經典的B+Tree進行了優化,在原B+Tree的基礎上,
增加了指向相鄰葉子節點的連結清單指針
,就形成了帶有順序指針的B+Tree,提高區間通路性能。
記錄時間:2021年1月6日