MySQL索引的各種型別
什麼是索引?
索引是資料庫儲存引擎用於快速查詢到指定資料的一種資料結構。
可以用新華字典做類比:如果新華字典中對每個字的詳細解釋是資料庫中表的記錄,那麼按部首或拼音等排序的目錄就是索引,使用它可以讓我們快速查詢的某一個字詳細解釋的位置。
在MySQL中,儲存引擎也是用了類似的方法,先在索引中找到對應的值,然後再根據匹配的索引值找到對應表中記錄的位置。
面試中為什麼問索引?
之所以在索引在面試中經常被問到,就是因為:索引是資料庫的良好效能表現的關鍵,也是對查詢能優化最有效的手段。索引能夠輕易地把查詢效能提高几個數量級。
然而,糟糕的索引也同樣會影響查詢效能,當表中的資料量越來越多的時候,索引對效能的影響就越大。在資料量比較少並且負責比較低的時候,糟糕的索引對效能的影響可能不明顯,但是當資料量逐漸增多的時候,效能會急劇下降。
索引的型別
經過前面的介紹,我們就進入正題,瞭解一下MySQL支援的索引型別,以及它們的原理和用法。
不同型別的索引,可以為不同場景提供更好的效能。在MySQL中,索引是在儲存引擎層面實現的,而不是在伺服器層面實現的。正如大家所知道,MySQL支援多種型別的儲存引擎。所以,在不同儲存引擎中索引的實現方式並不是一樣的,也不是所有型別的索引都被所有儲存引擎支援的,即使多個儲存引擎支援同一種類型的索引,它底層的實現也有可能是不相同的。
B-Tree索引
B-Tree索引是被大多數MySQL儲存引擎支援的,在我們討論索引時,假如沒有特別地說明型別,那麼大概率說的就是B-Tree索引了。我們使用B-Tree這個詞,是因為MySQL在建立表和其他語句中就使用這個關鍵字。
然而,在不同儲存引擎的底層可能使用不同的資料結構和演算法,比如:InnoDB儲存引擎內部使用的是B+Tree結構,NDB叢集儲存引擎內部使用的是T-Tree結構。不同儲存引擎用以不同的方式使用B-Tree索引,效能也可能不同,比如:InnoDB的索引上儲存的是原資料格式,而MyISAM儲存引擎使用字首壓縮技術使索引更小,InnoDB索引的行儲存的資料行的主鍵引用,而MyISAM儲存引擎的索引的行儲存的是資料行的物理位置。
B-Tree索引的原理
B-Tree索引能夠加快訪問資料的速度,因為不需要全表掃描就可以快速檢索的需要的資料。那麼B-Tree索引是怎麼做到的呢?我們通過一個簡單的例子瞭解一下InnoDB的B-Tree索引是怎麼工作的:
CREATE TABLE `om_address` ( `province_name` varchar(255) NOT NULL COMMENT '省',`city_name` varchar(255) NOT NULL COMMENT '市',`district_name` varchar(255) NOT NULL COMMENT '區',`detailed_address` varchar(255) NULL DEFAULT NULL COMMENT '詳細地址',INDEX `index_province_city_district`(`province_name`,`city_name`,`district_name`) USING BTREE ) ENGINE = InnoDB;
這個表中共有4個欄位,分別表示省、市、區和詳細地址,還有一個B-Tree索引,其中包含了省、市、區三個欄位。因為索引的所有值都是按照順序儲存的,即:節點的左子樹比當前節點小,節點的右子樹比當前節點大。那麼當查詢資料時,從索引的根節點開始搜尋,根據比較當前節點的索引值向子樹進行查詢,直到找到對應的索引值,或者根本沒有找到。
B-Tree索引的用法
根據B-Tree索引的特點,它可以用於全值匹配、值範圍匹配和最左字首匹配。
- 全值匹配是指和索引中所有的欄位進行匹配,比如:查詢黑龍江省哈爾濱市南崗區的資料。
- 值範圍匹配是指索引中欄位的某一範圍進行匹配,但是必須滿足前面欄位的全匹配,比如:第一個欄位province_name省名稱的全匹配,第二個欄位city_name城市名稱的範圍匹配。
- 最左字首匹配是指索引中欄位的某一開頭部分進行匹配,但是必須滿足前面欄位的全匹配,比如:第一個欄位province_name省名稱為內蒙古,第二個欄位city_name城市名稱以“呼”開頭。
雜湊索引
雜湊索引是基於雜湊表實現的,用於精確匹配索引所指向的資料。儲存引擎對每一行資料的所有索引欄位計算出一個雜湊碼,雜湊碼是一個比較小的值,並且不同的資料計算出來的雜湊碼一般情況下也不一樣。雜湊索引中存放了這個雜湊碼和指向這個資料行的指標。
在MySQL中,只有Memory儲存引擎支援雜湊索引,也是Memory儲存引擎的預設索引型別。另外,在InnoDB儲存引擎中也運用了雜湊索引,叫做自適應雜湊索引。當某些索引中被非常頻繁的使用時,InnoDB儲存引擎會在記憶體中基於B-Tree索引之上再建立一個雜湊索引,這樣一來使得B-Tree索引也具有的快速雜湊查詢的優點。
雜湊索引因為只需存放對應資料的雜湊值,所以索引的結構非常緊湊,佔用空間小,同時查詢速度也非常快。不過,雜湊索引只支援全值等值查詢,不能索引欄位範圍匹配和部分索引欄位匹配。
空間資料索引
空間資料索引(R-Tree)主要用於地理資料的儲存,會從所有維度來索引資料,查詢時可以有效的使用任意維度進行組合查詢。 目前,MyISAM儲存引擎支援空間資料索引,不過必須使用MySQL的GIS相關的函式來維護資料。
在MySQL中,空間索引只能建立在空間資料型別上,如:GEOMETRY、POINT、LINESTRING等。
全文索引
全文索引不像之前介紹的索引那樣直接比較索引中的值,而是直接比較查詢的文字中的關鍵詞,它類似於搜尋引擎做的事情,不是簡單的where條件匹配。
在相同的欄位上,可以同時建立全文索引和B-Tree索引,不會有衝突。全文索引適用於match和against操作,不是普通的where條件操作。在MySQL中,只能在型別為CHAR、VARCHAR、TEXT的欄位上建立全文索引。
總結
索引是資料庫儲存引擎用於快速查詢到指定資料的一種資料結構,它包括B-Tree索引、雜湊索引、空間資料索引、全文索引,其中B-Tree索引是我們最常用到的,InnoDB儲存引擎內部使用的是B+Tree結構;雜湊索引是基於雜湊表實現的,用於精確匹配索引所指向的資料;空間資料索引從所有維度來索引資料,查詢時可以有效的使用任意維度進行組合查詢;全文索引是直接比較查詢的文字中的關鍵詞,類似於搜尋引擎。
以上就是MySQL索引的各種型別簡介的詳細內容,更多關於MySQL 索引型別的資料請關注我們其它相關文章!