索引的基礎

1.索引的定義:

索引是存儲引擎用於快速找到記錄的一種數據結構。

索引可以包含一個或多個列的值。如果索引包含多個列,那麼列 的順序也十分重要,因爲MySQL只能高效地使用索引的最左前綴列

2.索引的類型

B-Tree索引

【實際上很多的存儲引擎使用的是B+Tree,B+樹是自平衡的多叉搜索樹,即每一個葉子節點都包含只想下一個葉子結點的指針,從而方便葉子結點的範圍遍歷】innoDB默認的使用B+樹

B-Tree索引能夠加快訪問數據的速度,因爲存儲引擎不再需要進行全表掃描來獲取需要的數據,取而代之的是從索引的根節點開始進行搜索。根節點的槽中存放了指向子節點的指針,存儲引擎根據這些指針向下層查找。索引對多個值進行排序的依據是Create Table語句中定義索引列的順序

索引的匹配:

(1)全值匹配:指的是和索引中所有的列進行匹配;

(2)最左前綴匹配:例如找出在學生表中找出姓唐的學生;

(3)匹配列前綴:也可以值匹配某一列的值的開頭部分;

在MySQL中只有Memory存儲引擎支持哈希索引

哈希索引的特點:

(1)哈希索引只包含哈希值和行指針,而不存儲字段值,所以不能使用索引中的值來避免讀取行。不過,訪問內存中的行的速度很舉哀,所以大部分情況下這一點對性能的影響不明顯;

(2)哈希索引數據並不是按照索引值順序存儲的,所以也就無法用於排序;

(3)哈希索引也不會支持部分索引列匹配查找,因爲哈希索引始終是使用索引列的全部內容來計算哈希值的。例如,在數據列(A,B)上建立哈希索引,如果查詢只有數據列A,則無法使用該索引。

(4)哈希索引只支持等值比較查詢,包括=、IN()、<=>,也不支持任何範圍查詢;

(5)訪問哈希索引的數據非常快,除非有很多哈希衝突(不同的索引列值卻有相同的哈希值)。當出現哈希衝突的時候,存儲引擎必須遍歷鏈表所有的行指針,逐行進行比較,知道找到所有符合條件的行;

(6)如果哈希衝突很多的話,一些索引維護操作的代價也會很高。例如,如果在某個選擇性很低(哈希衝突很多)的列上建立哈希索引,那麼當從表中刪除一行時,存儲引擎需要遍歷對應哈希值的鏈表中的每一行,找到並刪除對應行的引用,衝突越多,代價越大

InnoDB中的自適應哈希索引

當InnoDB注意到某些索引值被使用得非常頻繁時,它會在內存中基於B-Tree索引之上再創建一個哈希索引,這樣就讓B- Tree索引也具有哈希索引的一些優點,比如快速的哈希查找。這是一個完全自動的、內部的行爲,用戶無法控制或者配置,不過如果有必要,也完全可以關閉該功能。

空間數據索引

MyISAM表支持空間數據索引,可以用作地理數據存儲。B-Tree索引不同,這類索引無須前綴查詢。空間索引會從所有維度來索引數據。查詢時,可以有效地使用任意維度來組合查詢。必須使用MySQL的GIS相關函數來維護數據。

全文索引

全文索引是一種特殊類型的索引,它查找的文本中的關鍵詞,而不是直接比較索引中的值。全文搜索和其他幾類索引的匹配方式完全一樣。它有許多需要注意的細節,如停用詞、詞幹和複數、布爾搜索等

索引的優點:

(1)索引大大減少了服務器需要掃描的數據量;

(2)索引可以幫助服務器避免排序和臨時表;

(3)索引可以將隨機I/O變爲順序I/O

聚簇索引:

InnoDB 的聚簇索引實際上在同一個結構中保存了B-Tree索引和數據行。當表有聚簇索引時,它的數據行實際上存放在索引的葉子中。術語“聚簇”表示數據行和相鄰的值緊湊的存儲在一起。因爲無法同事把數據行存放在兩個不同的地方,所以一個表只能有一個聚簇索引

 

發佈了81 篇原創文章 · 獲贊 16 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章