Mysql 索引 总结 —— 概述 || 索引优势劣势|| 索引结构(索引是在MySQL的存储引擎层中实现的)|| BTREE 结构||B+TREE 结构||MySQL中的B+Tree||索引分类
索引概述
MySQL官方對索引的定義為:索引(index)是幫助MySQL高效獲取數據的數據結構(有序)。
在數據之外,數據庫系統還維護者滿足特定查找算法的數據結構,
這些數據結構以某種方式引用(指向)數據,
這樣就可以在這些數據結構上實現高級查找算法,
這種數據結構就是索引。
如下面的示意圖所示 :
左邊是數據表,一共有兩列七條記錄,最左邊的是數據記錄的物理地址(注意邏輯上相鄰的記錄在磁盤上也并不是一定物理相鄰的)。
為了加快Col2的查找,可以維護一個右邊所示的二叉查找樹,每個節點分別包含索引鍵值和一個指向對應數據記錄物理地址的指針,這樣就可以運用二叉查找快速獲取到相應數據。
一般來說索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲在磁盤上。
索引是數據庫中用來提高性能的最常用的工具。
索引優勢劣勢
優勢
1)類似于書籍的目錄索引,提高數據檢索的效率,降低數據庫的IO成本。
2)通過索引列對數據進行排序,降低數據排序的成本,降低CPU的消耗。
劣勢
1)實際上索引也是一張表,該表中保存了主鍵與索引字段,并指向實體類的記錄,所以索引列也是要占用空間的。
2)雖然索引大大提高了查詢效率,同時卻也降低更新表的速度,如對表進行INSERT、UPDATE、DELETE。
???? 因為更新表時,MySQL 不僅要保存數據,還要保存一下索引文件每次更新添加了索引列的字段,都會調整因為更新所帶來的鍵值變化后的索引信息
索引結構
索引是在MySQL的存儲引擎層中實現的,而不是在服務器層實現的。
所以每種存儲引擎的索引都不一定完全相同,也不是所有的存儲引擎都支持所有的索引類型的。
MySQL目前提供了以下4種索引:
BTREE 索引:最常見的索引類型,大部分索引都支持 B 樹索引。
HASH 索引:只有Memory引擎支持,使用場景簡單。
R-tree 索引(空間索引):空間索引是MyISAM引擎的一個特殊索引類型,主要用于地理空間數據類型,通常使用較少,不做特別介紹。
Full-text (全文索引):全文索引也是MyISAM的一個特殊索引類型,主要用于全文索引,InnoDB從Mysql5.6版本開始支持全文索引。
BTREE 結構
BTree又叫多路平衡搜索樹,一顆m叉的BTree特性如下:
樹中每個節點最多包含m個孩子。
除根節點與葉子節點外,每個節點至少有[ceil(m/2)]個孩子。
若根節點不是葉子節點,則至少有兩個孩子。所有的葉子節點都在同一層。
每個非葉子節點由n個key與n+1個指針組成,其中[ceil(m/2)-1] <= n <= m-1
?
以5叉BTree為例,key的數量:公式推導[ceil(m/2)-1] <= n <= m-1。所以 2 <= n <=4 。當n>4時,中間節點分裂到父節點,兩邊節點分裂。
插入 C N G A H E K Q M F W L T Z D P R X Y S 數據為例。
B+TREE 結構
B+Tree為BTree的變種,B+Tree與BTree的區別為:
1). n叉B+Tree最多含有n個key,而BTree最多含有n-1個key。
2). B+Tree的葉子節點保存所有的key信息,依key大小順序排列。
3). 所有的非葉子節點都可以看作是key的索引部分。
MySQL中的B+Tree
MySql索引數據結構對經典的B+Tree進行了優化。
在原B+Tree的基礎上,增加一個指向相鄰葉子節點的鏈表指針,就形成了帶有順序指針的B+Tree,提高區間訪問的性能。
MySQL中的 B+Tree 索引結構示意圖:
索引分類
1)單值索引:即一個索引只包含單個列,一個表可以有多個單列索引
2)唯一索引:索引列的值必須唯一,但允許有空值
3)復合索引:即一個索引包含多個列
總結
以上是生活随笔為你收集整理的Mysql 索引 总结 —— 概述 || 索引优势劣势|| 索引结构(索引是在MySQL的存储引擎层中实现的)|| BTREE 结构||B+TREE 结构||MySQL中的B+Tree||索引分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVCC 初识
- 下一篇: 索引语法——创建索引 || 查看索引 |