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