您現在的位置是:首頁 > 棋牌

5分鐘快速瞭解MySQL索引的各種型別

  • 由 計算機java程式設計 發表于 棋牌
  • 2022-01-05
簡介總結索引是資料庫儲存引擎用於快速查詢到指定資料的一種資料結構,它包括B-Tree索引、雜湊索引、空間資料索引、全文索引,其中B-Tree索引是我們最常用到的,InnoDB儲存引擎內部使用的是B+Tree結構

什麼欄位檢索範圍最大

5分鐘快速瞭解MySQL索引的各種型別

什麼是索引?

索引是資料庫儲存引擎用於快速查詢到指定資料的一種資料結構。

可以用新華字典做類比:如果新華字典中對每個字的詳細解釋是資料庫中表的記錄,那麼按部首或拼音等排序的目錄就是索引,使用它可以讓我們快速查詢的某一個字詳細解釋的位置。

在MySQL中,儲存引擎也是用了類似的方法,先在索引中找到對應的值,然後再根據匹配的索引值找到對應表中記錄的位置。

5分鐘快速瞭解MySQL索引的各種型別

MySQL必知必會

¥

48。5

京東

月銷2499

購買

面試中為什麼問索引?

之所以在索引在面試中經常被問到,就是因為:索引是資料庫的良好效能表現的關鍵,也是對查詢能最佳化最有效的手段。索引能夠輕易地把查詢效能提高几個數量級。

然而,糟糕的索引也同樣會影響查詢效能,當表中的資料量越來越多的時候,索引對效能的影響就越大。在資料量比較少並且負責比較低的時候,糟糕的索引對效能的影響可能不明顯,但是當資料量逐漸增多的時候,效能會急劇下降。

索引的型別

經過前面的介紹,我們就進入正題,瞭解一下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索引是怎麼工作的:

5分鐘快速瞭解MySQL索引的各種型別

這個表中共有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結構;雜湊索引是基於雜湊表實現的,用於精確匹配索引所指向的資料;空間資料索引從所有維度來索引資料,查詢時可以有效的使用任意維度進行組合查詢;全文索引是直接比較查詢的文字中的關鍵詞,類似於搜尋引擎。

5分鐘快速瞭解MySQL索引的各種型別

想了解更多精彩內容,快來關注

計算機java程式設計

Top