MySQL索引專題一 認識索引

2021-08-04 08:32:31 字數 4139 閱讀 7216

想寫mysql的索引專題是源於之前自己在學習mysql索引時痛苦的經歷,你在網上搜尋關於mysql的索引的文章,大多是支離破碎,沒有系統性的對知識點的羅列堆砌,文章中會說明你要如何如何做,但是很少涉及去講為什麼要這麼做,哪些不能做,很難對mysql有乙個系統性的認知,學習如果沒有系統性的話,就很難在實際的專案中靈活運用,出於此目的,自己就打算寫乙個關於mysql索引的專題系列,算是自己乙個學習的總結,如果同時能幫到你那再好不過了。下面進入正題,我們先來了解一下什麼是索引以及索引的型別。

認識索引是什麼東西非常關鍵,乙個非常恰當的比喻就是書的目錄頁書的正文內容之間的關係,為了方便查詢書中的內容,通過對內容建立索引形成目錄。因此,首先你要明白的一點就是,索引它也是乙個檔案,它是要佔據物理空間的。

比如對於myisam儲存引擎來說:

.frm字尾的檔案儲存的是表結構。

.myd字尾的檔案儲存的是表資料。

.myi字尾的檔案儲存的就是索引檔案。

如下圖所示:

對於innodb儲存引擎來說:

.frm字尾的檔案儲存的是表結構。

.ibd字尾的檔案存放索引檔案和資料(需要開啟innodb_file_per_table引數)

如下圖所示:

因此,當你對一張表建立索引時,索引檔案的大小也會改變,當你資料表中的資料因為增刪改變化時,索引檔案也會變化的,只不過mysql會自動維護索引,這個過程不需要你介入,這也是為什麼不恰當的索引會影響mysql效能的原因。

總結:1. 索引是按照特定的資料結構把資料表中的資料放在索引檔案中,以便於快速查詢;

2. 索引存在於磁碟中,會佔據物理空間。

上面說到,索引檔案時按照不同的資料結構來儲存的,資料結構的不同也產生了不同的索引型別,常見的索引型別包括:

b-tree索引

雜湊索引

空間資料索引(r-tree)

全文索引

下面做一一介紹:

1.b-tree索引

b-tree索引是最常用的一種索引,如果沒有指定特定的型別,那麼多半就是b-tree索引,事實上,很多搜尋引擎使用的是它的變種b+tree,這是對b-tree的乙個優化,如果需要詳細了解,可以參考資料結構方面的書籍,這裡不做詳細**。以下統稱為b-tree索引。

絕大多數的儲存引擎,比如myisaminnodb都支援這種索引,因此說它是應用最廣泛,最常用的一種索引方式,但是不同的儲存引擎在具體實現時會稍有不同,比如myisam會使用字首壓縮的方式對索引進行壓縮,innodb則不會。

下圖展示了b-tree索引是如何儲存被索引的資料的:

說明:

左圖是乙個包含三列的資料表,右圖則展示了資料是如何被索引的。

可以看出b-tree是對索引列是按照順序儲存的,每個葉子節點指向被索引的資料,這也是b-tree索引支援範圍查詢資料的原因。

2. 雜湊索引

相比於b-tree索引,雜湊索引的實現就比較簡單了,它是基於雜湊表來實現的,對於要索引的列,儲存引擎會計算出一一對應的雜湊碼,然後把雜湊碼存放在雜湊表中作為keyvalue值是指向該行資料的指標。

下圖是簡單的原理展示:

說明:

左邊紫色圖表示乙個二列的資料表。

中間表示對fname列進行雜湊索引,計算出雜湊值。

右邊綠色圖表示把生成的雜湊值存放於雜湊表中。

當我們執行以下查詢時:

select * from testtable where fname = "mary";
mysql會首先計算查詢條件mary的雜湊值,然後到雜湊表中去找該雜湊值,如果找到了根據對應的指標也就找到了需要尋找的資料行。

雜湊表的優勢與限制:

因此,雜湊索引雖然速度快,但其實使用很受限,只適用於某些特殊的場合。

3. 空間資料索引(r-tree)

空間索引可用於地理資料儲存,它需要gis相關函式的支援,由於mysqlgis支援並不完善,所以該索引方式在mysql中很少有人使用。

4. 全文索引

全文索引主要用於海量資料的搜尋,比如**或者京東對商品的搜尋,你不可能使用like進行模糊匹配吧,mysql5.6開始支援innodb引擎的全文索引,功能沒有專業的搜尋引擎比如sphinxsolr豐富,如果你的需求比較簡單,可以嘗試一下mysql的全文索引,否則建議使用專業的搜尋引擎。

總結:1. b-tree索引使用最廣泛,主流引擎都支援。

2. 雜湊索引效能高,適用於特殊場合。

3.r-tree不常用。

4. 全文索引適用於海量資料的關鍵字模糊搜尋。

上面講述了索引有不同的型別,儲存引擎也有不同的型別,那麼索引和儲存引擎之間有什麼關係呢? 

首先你需要知道,在mysql中,索引是在儲存引擎中實現的,並不是所有的儲存引擎都支援所有的索引型別,比如雜湊索引,myisaminnodb是不支援的;同樣,即使對於同一型別的索引,不同的儲存引擎實現的方式也可能是不同的,比如myisaminnodbb-tree索引,具體的實現是有差別的。

總結:1. 不同的儲存引擎可能支援不同的索引型別;

2. 不同的儲存引擎對同一中索引型別可能有不同的實現方式。

最開始對b-tree索引與唯一索引,主鍵索引,普通索引這幾種索引的關係很模糊,網上也沒搜尋到相關的資料,以為他們的關係是並列的,其實並不是,b-tree只是底層的演算法實現,唯一索引,主鍵索引,普通索引都是基於b-tree索引演算法的,只不過又有各自的特點。

通過下圖也可看出這種關係:

至於唯一索引,主鍵索引,普通索引之間的區別,下面補充一下:

這篇文章先說到這裡,目的主要是對mysql的索引有個概念上的認識,以及了解索引的型別,索引和儲存引擎之間的關係,本專題會繼續更新,繼續對mysql索引知識逐漸展開,如果你感興趣的話可以關注該專欄,以及順便動動手指關注一下我(^_^),希望本文對你有所幫助。

原文:

MySQL學習(一)索引的基本認識

額外的 我已知的自動建立索引的時機 建立主鍵,唯一,外來鍵約束的時候 一 索引簡介 1.1 索引的含義和特點 底層實現分 btree索引 主要是b樹索引 hash索引 索引優點 提高查詢,聯合查詢,分級和排序的時間 索引缺點 索引佔空間,維護 建立,更新,維護 索引時需要耗費時間 1.2 索引的分類...

MySQL索引(一)索引基礎

索引是資料庫系統裡面最重要的概念之一。一句話簡單來說,索引的出現其實是為了提高資料查詢的效率,就像書的目錄一樣。索引的出現是為了提高查詢效率,但是實現索引的方式卻有很多種,這裡就介紹三種常見 也比較簡單的資料結構,它們分別是雜湊表 有序陣列和搜尋樹。雜湊表雜湊表是一種以key value儲存資料的結...

mysql排序欄位的索引認識

因專案需要,需要對資料庫一張表進行排序,取前10名 該錶基數6w,invite sign geight 條件加上後資料為2w 未優化前,sql語句如下 select from wk active gt sign info where invite sign geight order by invit...