Mysql索引型別

2021-08-02 14:15:52 字數 4423 閱讀 8695

優點:有了索引.對於記錄數量很多的表,可以提高查詢速度。

缺點:索引是占用空間的。索引會影響update insert delete速度。

一,fulltext:全文索引,目前只有myisam引擎支援。其可以在create table ,alter table ,create index 使用,不過目只有 char、varchar ,text 列上可以建立全文索引。為了解決where name like 「%word%"這類針對文字的模糊查詢效率較低的問題。【使用情況】:由於fulltext對中文支援不是很好,在沒有外掛程式的情況下,最好不要使用。其實,一些小的部落格應用,只需要在資料採集時,為其建立關鍵字列表,通過關鍵字索引,也是乙個不錯的方法。

二,hash:hsah索引在mysql比較少用,他以把資料的索引以hash形式組織起來,因此當查詢某一條記錄的時候,速度非常快.當時因為是hash結構,每個鍵只對應乙個值,而且是雜湊的方式分布.所以他並不支援範圍查詢和排序等功能. 只有memory支援hash索引【使用情況】:正是因為hash表在處理較小資料量時具有無可比擬的素的優勢,所以hash索引很適合做快取(記憶體資料庫)。如mysql資料庫的記憶體版本memsql,使用量很廣泛的快取工具mencached,nosql資料庫redis等,都使用了hash索引這種形式。當然,不想學習這些東西的話mysql的memory引擎也是可以滿足這種需求的。

三,rtree:rtree在mysql很少使用,僅支援geometry資料型別,支援該型別的儲存引擎只有myisam、bdb、innodb、ndb、archive幾種。【優勢】:相對於btree,rtree的優勢在於範圍查詢。

四,btree:btree分為b-tree和b+tree【使用情況】:對於btree這種mysql預設的索引型別,具有普遍的適用性。

(1),b-tree介紹: b-tree是一種多路搜尋樹(並不是二叉的):

a.定義任意非葉子結點最多只有m個兒子;且m>2;

b.根結點的兒子數為[2, m];

c.除根結點以外的非葉子結點的兒子數為[m/2, m];

d.每個結點存放至少m/2-1(取上整)和至多m-1個關鍵字;(至少2個關鍵字)

e.非葉子結點的關鍵字個數=指向兒子的指標個數-1;

f.非葉子結點的關鍵字:k[1], k[2], …, k[m-1];且k[i] < k[i+1];

g.非葉子結點的指標:p[1], p[2], …, p[m];其中p[1]指向關鍵字小於k[1]的子樹,p[m]指向關鍵字大於k[m-1]的子樹,其它p[i]指向關鍵字屬於(k[i-1], k[i])的子樹;

h.所有葉子結點位於同一層。

搜尋過程:b-樹的搜尋,從根結點開始,對結點內的關鍵字(有序)序列進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指標為空,或已經是葉子結點。

注:多路查詢,並且小於17選擇p1指標對應的磁碟塊,或者就是大於17小於35的則選擇p2指標對應的磁碟塊,大於35的選擇p3指標對應的磁碟塊

b-樹的特性:

1.關鍵字集合分布在整顆樹中;

2.任何乙個關鍵字出現且只出現在乙個結點中;

3.搜尋有可能在非葉子結點結束;

4.其搜尋效能等價於在關鍵字全集內做一次二分查詢;

5.自動層次控制;

為什麼選用b-tree:

如果一次檢索需要訪問4個節點,資料庫系統設計者利用磁碟預讀原理,把節點的大小設計為乙個頁,那讀取乙個節點只需要一次i/o操作,完成這次檢索操作,最多需要3次i/o(根節點常駐記憶體)。資料記錄越小,每個節點存放的資料就越多,樹的高度也就越小,i/o操作就少了,檢索效率也就上去了。

(2),b+tree介紹: b+樹是b-樹的變體,也是一種多路搜尋樹:

1.其定義基本與b-樹同,除了:

2.非葉子結點的子樹指標與關鍵字個數相同;

3.非葉子結點的子樹指標p[i],指向關鍵字值屬於[k[i], k[i+1])的子樹(b-樹是開區間);

5.為所有葉子結點增加乙個鏈指標;

6.所有關鍵字都在葉子結點出現;

搜尋過程:b+的搜尋與b-樹也基本相同,區別是b+樹只有達到葉子結點才命中(b-樹可以在非葉子結點命中),其效能也等價於在關鍵字全集做一次二分查詢。

注:按區間查詢,5到28選擇p1,28到65選擇p2,小於5,前面還有乙個搜尋樹,而大於65的也是一樣的道理,搜尋樹對應的 一段區間的值。

b+的特性:

1.所有關鍵字都出現在葉子結點的鍊錶中(稠密索引),且鍊錶中的關鍵字恰好是有序的;

2.不可能在非葉子結點命中;

3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是儲存(關鍵字)資料的資料層;

4.更適合檔案索引系統;

為什麼選用b+tree:

(1)hash 索引僅僅能滿足"=","in"和"<=>"查詢,不能使用範圍查詢。 由於 hash 索引比較的是進行 hash 運算之後的 hash 值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的 hash 演算法處理之後的 hash 值的大小關係,並不能保證和hash運算前完全一樣。

(2)hash 索引無法被用來避免資料的排序操作。 由於 hash 索引中存放的是經過 hash 計算之後的 hash 值,而且hash值的大小關係並不一定和 hash 運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算;

(3)hash 索引不能利用部分索引鍵查詢。 對於組合索引,hash 索引在計算 hash 值的時候是組合索引鍵合併後再一起計算 hash 值,而不是單獨計算 hash 值,所以通過組合索引的前面乙個或幾個索引鍵進行查詢的時候,hash 索引也無法被利用。

(4)hash 索引在任何時候都不能避免表掃瞄。 前面已經知道,hash 索引是將索引鍵通過 hash 運算之後,將 hash運算結果的 hash 值和所對應的行指標資訊存放於乙個 hash 表中,由於不同索引鍵存在相同 hash 值,所以即使取滿足某個 hash 鍵值的資料的記錄條數,也無法從 hash 索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,並得到相應的結果。

(5)hash 索引遇到大量hash值相等的情況後效能並不一定就會比b-tree索引高。 對於選擇性比較低的索引鍵,如果建立 hash 索引,那麼將會存在大量記錄指標資訊存於同乙個 hash 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料的訪問,而造成整體效能低下。

(1)myisam支援全文索引(fulltext)、壓縮索引,innodb不支援。

(2)innodb支援事務,myisam不支援。

(3)myisam順序儲存資料,索引葉子節點儲存對應資料行位址,輔助索引很主鍵索引相差無幾;innodb主鍵節點同時儲存資料行,其他輔助索引儲存的是主鍵索引的值;

(4)myisam鍵值分離,索引載入記憶體(key_buffer_size),資料快取依賴作業系統;innodb鍵值一起儲存,索引與資料一起載入innodb緩衝池;myisam主鍵(唯一)索引按公升序來儲存儲存,innodb則不一定。

(5)myisam索引的基數值(cardinality,show index 命令可以看見)是精確的,innodb則是估計值。這裡涉及到資訊統計的知識,myisam統計資訊是儲存磁碟中,在alter表或analyze table操作更新此資訊,而innodb則是在表第一次開啟的時候估計值儲存在快取區內。

(6)myisam處理字串索引時用增量儲存的方式,如第乙個索引是『preform』,第二個是『preformence』,則第二個儲存是『7,ance』,這個明顯的好處是縮短索引,但是缺陷就是不支援倒序提取索引,必須順序遍歷獲取索引。

主鍵索引

primary key(主鍵索引)  alter table `table_name` add primary key ( `column` );

【應用場景】大資料時,主鍵可用於where條件和order by條件。

唯一索引

unique(唯一索引)     alter table `table_name` add unique (`column`);

【應用場景】建立唯一索引的目的往往不是為了提高訪問速度,而只是為了避免資料出現重複。

普通索引

index(普通索引)     alter table `table_name` add index index_name ( `column` );

【應用場景】加快資料的訪問速度。

全文索引

fulltext(全文索引)      alter table `table_name` add fulltext ( `column` );

【應用場景】解決模糊查詢效率低的問題。

組合索引

組合索引   alter table `table_name` add index index_name ( `column1`, `column2`, `column3` ); 

【應用場景】mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c). 可以支援a | a,b| a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 .當最左側欄位是常量引用時,索引就十分有效。

mysql索引型別介紹 mysql索引型別介紹

索引型別介紹 主鍵索引 primary key 要求關鍵字不能重複,也不能為null,同時增加主鍵約束 主鍵索引定義時,不能命名 唯一索引 unique index 要求關鍵字不能重複,同時增加唯一約束 普通索引 index 對關鍵字沒有要求 全文索引 fulltext key 關鍵字的 不是所有欄...

mysql索引型別介紹 mysql索引型別介紹

b 樹是多路平衡查詢樹,相對於平衡二叉樹,對父結點的直接子結點個數,不再僅限於2,可以指定m 自定義 這樣可以在樹的深度不大量增加的前提下,儲存更多的結點。b 樹是通常在檔案系統中使用。特點 a 樹的每個結點最多有m 自定義 子結點 b 若根結點不是葉子結點,則至少有兩個子結點 c 除根結點外的所有...

MySQL索引 索引型別

在mysql有兩種索引型別 hash b 樹 hash索引原理比較簡單就是利用了乙個hash表 說b 樹之前先要了解b 樹的資料結構。不廢話,先上圖。對b 樹做一些解釋,參考上圖。b 樹的資料都在葉子節點上 非葉子節點上的這些都是範圍。舉例 最上面的根節點上的資料是5,28,65代表的是它的三個子樹...