mysql 索引 實現 MySQL索引原理及實現

2021-10-18 02:37:38 字數 1749 閱讀 9491

主要內容:

索引本質

mysql索引實現

前言索引是儲存引擎快速查詢記錄的一種資料結構,它對於效能非常關鍵,尤其是對於表資料量較大的情況,索引對效能的影響愈發重要。所以了解索引對於效能優化極其重要。

索引本質

mysql儲存引擎使用索引的方法,類似於讀一本書時如果想查詢特定的主題的話,需要先看書的目錄,查詢對應的頁碼,翻到指定頁碼檢視內容。即首先在索引中查詢對應索引值,然後根據索引記錄查詢對應的資料行。

mysql支援多種索引,例如b樹索引、雜湊索引、全文索引等,本文重點介紹b樹索引。

b+樹索引

mysql一般以b+樹作為其索引結構,具體有什麼特點呢?

所有值按順序儲存,每個葉子到根的距離相同

非葉子節點不儲存資料,只儲存指標索引;葉子節點儲存所有資料,不儲存指標

每個葉子節點都有指向相鄰下乙個葉子節點的指標,即順序訪問指標,如圖所示

帶順序訪問的b+樹簡圖

b-tree索引能夠提高區間訪問的效能。因為儲存引擎不需要全表掃瞄,例如要找key為20的資料,從根節點開始搜尋,根節點儲存了指向子節點的指標,這個指標定義了子節點中值的上限、下限;通過比較節點值和需要查詢的值,按著順序訪問路線一次性訪問所有資料節點。

區域性性原理和磁碟預讀

那麼為什麼資料庫系統普遍使用b+樹作為索引結構,而不選例如紅黑樹其他結構呢?首先要先來介紹下區域性性原理和磁碟預讀的概念。

一般來說,索引本身較大,不會全部儲存在記憶體中,會以索引檔案的形式儲存在磁碟上。所以索引查詢資料過程中就會產生磁碟io操作,而磁碟io相對於記憶體訪問非常緩慢,因此索引結構要儘量減少磁碟io的訪問次數。

為了減少磁碟io,磁碟往往會進行資料預讀,會從某位置開始,預先向後讀取一定長度的資料放入記憶體,即區域性性原理。因為磁碟順序讀取的效率較高,不需要尋道時間,因此可以提高io效率。

預讀長度一般為頁的整數倍,主存和磁碟以頁作為單位交換資料。當需要讀取的資料不在記憶體時,觸發缺頁中斷,系統會向磁碟發出讀取磁碟資料的請求,磁碟找到資料的起始位置並向後連續讀取一頁或幾頁資料載入記憶體,然後中斷返回,系統繼續執行。而一般資料庫系統設計時會將b+樹節點的大小設定為一頁,這樣每個節點的載入只需要一次io。

mysql索引實現

mysql存在多種儲存引擎的選擇,不同儲存引擎對索引的實現是不同的,本章著重對常見儲存引擎innodb和myisam儲存引擎的索引實現進行討論。

innodb索引實現

使用b+樹作為索引結構,資料檔案本身就是索引檔案。資料檔案按照b+樹的結構進行組織,葉節點的data域儲存完整的資料記錄,索引的key即為表的主鍵。下圖為主鍵索引示意圖(盜圖一波)。聚集索引使得搜尋主鍵非常高效。

innodb主索引.png

資料檔案本身按主鍵索引,因此innodb必須要有主鍵。沒有主鍵怎麼指定主鍵?

下圖為輔助索引示意圖,innodb輔助索引的data域儲存的是主鍵的值。搜尋輔助索引需要先根據輔助索引獲取到主鍵值,再根據主鍵到主索引中獲取到對應的資料記錄。

innodb輔助索引.png

myisam索引實現

同樣也是使用b+樹作為索引結構,葉子節點data域儲存的是資料記錄的位址。資料檔案和索引檔案是分別儲存在***.myd和***.myi(***表示資料表名),索引檔案***.myi儲存資料記錄的位址,具體可參考mysql儲存引擎簡介。如圖所示(盜了個圖),為主索引的示意圖。myisam中檢索索引演算法為:首先按照b+樹搜尋演算法搜尋,如果找到指定的key,取出其data域的值,再以data域值為位址查詢對應的資料記錄。因此myisam的索引方式也稱為非聚集索引。

myisam索引實現原理圖.png

mysql 雜湊索引 MySQL索引之雜湊索引

雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...

mysql主鍵索引 MySQL索引之主鍵索引

在mysql裡,主鍵索引和輔助索引分別是什麼意思,有什麼區別?上次的分享我們介紹了聚集索引和非聚集索引的區別,本次我們繼續介紹主鍵索引和輔助索引的區別。1 主鍵索引 主鍵索引,簡稱主鍵,原文是primary key,由乙個或多個列組成,用於唯一性標識資料表中的某一條記錄。乙個表可以沒有主鍵,但最多只...

mysql聚集索引 MySQL索引之聚集索引介紹

在mysql裡,聚集索引和非聚集索引分別是什麼意思,有什麼區別?在mysql中,innodb引擎表是 聚集 索引組織表 clustered index organize table 而myisam引擎表則是堆組織表 heap organize table 也有人把聚集索引稱為聚簇索引。當然了,聚集索...