想寫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
索引。
絕大多數的儲存引擎,比如myisam
和innodb
都支援這種索引,因此說它是應用最廣泛,最常用的一種索引方式,但是不同的儲存引擎在具體實現時會稍有不同,比如myisam
會使用字首壓縮的方式對索引進行壓縮,innodb
則不會。
下圖展示了b-tree
索引是如何儲存被索引的資料的:
說明:2. 雜湊索引左圖是乙個包含三列的資料表,右圖則展示了資料是如何被索引的。
可以看出
b-tree
是對索引列是按照順序儲存的,每個葉子節點指向被索引的資料,這也是b-tree
索引支援範圍查詢資料的原因。
相比於b-tree
索引,雜湊索引的實現就比較簡單了,它是基於雜湊表來實現的,對於要索引的列,儲存引擎會計算出一一對應的雜湊碼
,然後把雜湊碼存放在雜湊表中作為key
,value
值是指向該行資料的指標。
下圖是簡單的原理展示:
說明:當我們執行以下查詢時:左邊紫色圖表示乙個二列的資料表。
中間表示對
fname
列進行雜湊索引,計算出雜湊值。右邊綠色圖表示把生成的雜湊值存放於雜湊表中。
select * from testtable where fname = "mary";
mysql
會首先計算查詢條件mary
的雜湊值,然後到雜湊表中去找該雜湊值,如果找到了根據對應的指標也就找到了需要尋找的資料行。
雜湊表的優勢與限制:
因此,雜湊索引雖然速度快,但其實使用很受限,只適用於某些特殊的場合。
3. 空間資料索引(r-tree
)
空間索引可用於地理資料儲存,它需要gis
相關函式的支援,由於mysql
的gis
支援並不完善,所以該索引方式在mysql
中很少有人使用。
4. 全文索引
全文索引主要用於海量資料的搜尋,比如**或者京東對商品的搜尋,你不可能使用like
進行模糊匹配吧,mysql
從5.6
開始支援innodb
引擎的全文索引,功能沒有專業的搜尋引擎比如sphinx
或solr
豐富,如果你的需求比較簡單,可以嘗試一下mysql
的全文索引,否則建議使用專業的搜尋引擎。
總結:1. b-tree索引使用最廣泛,主流引擎都支援。
2. 雜湊索引效能高,適用於特殊場合。
3.r-tree
不常用。
4. 全文索引適用於海量資料的關鍵字模糊搜尋。
上面講述了索引有不同的型別,儲存引擎也有不同的型別,那麼索引和儲存引擎之間有什麼關係呢?
首先你需要知道,在mysql
中,索引是在儲存引擎中實現的,並不是所有的儲存引擎都支援所有的索引型別,比如雜湊索引,myisam
和innodb
是不支援的;同樣,即使對於同一型別的索引,不同的儲存引擎實現的方式也可能是不同的,比如myisam
和innodb
對b-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...