1. 程式人生 > 資料庫 >Mysql InnoDB引擎的索引與儲存結構詳解

Mysql InnoDB引擎的索引與儲存結構詳解

前言

在Oracle 和SQL Server等資料庫中只有一種儲存引擎,所有資料儲存管理機制都是一樣的。

而MySql資料庫提供了多種儲存引擎。使用者可以根據不同的需求為資料表選擇不同的儲存引擎,使用者也可以根據自己的需要編寫自己的儲存引擎。

MySQL主要儲存引擎的區別

MySQL預設的儲存引擎是MyISAM,其他常用的就是InnoDB,另外還有MERGE、MEMORY(HEAP)等。

主要的幾個儲存引擎

MyISAM管理非事務表,提供高速儲存和檢索,以及全文搜尋能力。

MyISAM是Mysql的預設儲存引擎。當create建立新表時,未指定新表的儲存引擎時,預設使用MyISAM。每個MyISAM在磁碟上儲存成三個檔案。檔名都和表名相同,副檔名分別是.frm(儲存表定義)、.MYD (MYData,儲存資料)、.MYI (MYIndex,儲存索引)。資料檔案和索引檔案可以放置在不同的目錄,平均分佈io,獲得更快的速度。

InnoDB儲存引擎用於事務處理應用程式,具有眾多特性,包括ACID事務支援,提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比MyISAM儲存引擎,InnoDB寫的處理效率差一些並且會佔用更多的磁碟空間以保留資料和索引。

Memory將所有資料儲存在記憶體中,可以應用於臨時表中在需要快速查詢引用和其他類似資料的環境下,可提供極快的訪問。Memory使用雜湊索引,所以資料的存取速度非常快。

Merge允許MySQL DBA或開發人員將一系列等同的MyISAM表以邏輯方式組合在一起,並作為1個物件引用它們。對於諸如資料倉儲等VLDB環境十分適合。

不同儲存引擎的橫向對比

特點 MyISAM BDB Memory InnoDB
儲存限制 沒有 沒有 64TB
事務安全 支援 支援
鎖機制 表鎖 頁鎖 表鎖 行鎖
B樹索引 支援 支援 支援 支援
雜湊索引 支援 支援
全文索引 支援
叢集索引 支援
資料快取 支援 支援
索引快取 支援 支援 支援
資料可壓縮 支援
空間使用 N/A
記憶體使用 中等
批量插入的速度
支援外來鍵 支援

檢視和配置儲存引擎的操作

1.用show engines; 命令可以顯示當前資料庫支援的儲存引擎情況;

2.要查看錶的定義結構等資訊可以使用以下幾種命令:

Desc[ribe] tablename; //檢視資料表的結構
Show create table tablename; //顯示錶的建立語句,可以檢視建立表時指定的ENGINE
show table status like ‘tablename'\G顯示錶的當前狀態值

3.設定或修改表的儲存引擎

建立資料庫表時設定儲存儲存引擎的基本語法是:

Create table tableName(
columnName(列名1) type(資料型別) attri(屬性設定),columnName(列名2) type(資料型別) attri(屬性設定),……..) engine = engineName

修改儲存引擎,可以用命令

Alter table tableName engine =engineName

對於整個伺服器或方案,你並不一定要使用相同的儲存引擎,可以為方案中的每個表使用不同的儲存引擎。

InnoDB的儲存結構

InnoDB使用頁面儲存結構,下面是InnoDB的表空間結構圖:

Page頁面儲存格式如下圖所示:

一個頁面的儲存由以下幾部分組成:

  1. 頁頭(Page Header):記錄頁面的控制資訊,共佔150位元組,包括頁的左右兄弟頁面指標、頁面空間使用情況等,頁頭的詳細說明會在下一篇中描述。
  2. 最小虛記錄、最大虛記錄:兩個固定位置儲存的虛記錄,本身並不儲存資料。最小虛記錄比任何記錄都小,而最大虛記錄比任何記錄都大。
  3. 記錄堆(record heap):指上圖的橙黃色部分。表示頁面已分配的記錄空間,也是索引資料的真正儲存區域。記錄堆分為兩種,即有效記錄和已刪除記錄。有效記錄就是索引正常使用的記錄,而已刪除記錄表示索引已經刪除,不在使用的記錄,如上圖的深藍色部分。隨著記錄的更新和刪除越來越頻繁,記錄堆中已刪除記錄將會越多,即會出現越來越多的空洞(碎片)。這些已刪除記錄連線起來,就會成為頁面的自由空間連結串列。
  4. 未分配空間:指頁面未使用的儲存空間,隨著頁面不斷使用,未分配空間將會越來越小。當新插入一條記錄時,首先嚐試從自由空間連結串列中獲得合適的儲存位置(空間足夠),如果沒有滿足的,就會在未分配空間中申請。
  5. slot區:slot是一些頁面有效記錄的指標,每個slot佔兩個位元組,儲存了記錄相對頁面首地址的偏移。如果頁面有n條有效記錄,那麼slot的數量就在n/8+2~n/4+2之間。下一節詳細介紹slot區,它是記錄頁面有序和二分查詢的關鍵。
  6. 頁尾(Page Tailer):頁面最後部分,佔8個位元組,主要儲存頁面的校驗資訊。

頁面中的頁頭,最大/最小虛記錄以及頁尾都是頁面中有固定的儲存位置。

InnoDB的索引結構

InnoDB使用B+Tree的方式儲存索引。

Innodb的一個表可能包含多個索引,每個索引都使用B+樹來儲存。而索引包括聚集索引和二級索引,聚集索引使用表的主鍵作為索引鍵,包含表的所有欄位。二級索引只包含索引鍵和聚集索引鍵(主鍵)的內容,不包括其他欄位。每一個索引都是一棵B+樹,每棵B+樹由很多頁面組成,而每個頁面大小一般為16K。從B+樹的組織結構來看,B樹的頁面可分為:

葉子節點:B樹層次為0的頁面,儲存記錄的所有內容。
非葉子節點:B樹層次大於0的頁面,只儲存索引鍵和頁面指標。

一棵典型的B+樹結構:

從上圖可知,相同層次的頁面是用一個雙向連結串列連線起來的。

一般情況下,從B+樹的最左邊葉子節點開始,一直向右掃描,就可以得到B+樹的從小到大的所有資料。因此,對於葉子節點,有如下特徵:

頁內資料是按索引鍵排序的。

頁面的任一記錄的索引鍵值不小於其左兄弟頁面的任何記錄。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。