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頁面儲存格式如下圖所示:
一個頁面的儲存由以下幾部分組成:
- 頁頭(Page Header):記錄頁面的控制資訊,共佔150位元組,包括頁的左右兄弟頁面指標、頁面空間使用情況等,頁頭的詳細說明會在下一篇中描述。
- 最小虛記錄、最大虛記錄:兩個固定位置儲存的虛記錄,本身並不儲存資料。最小虛記錄比任何記錄都小,而最大虛記錄比任何記錄都大。
- 記錄堆(record heap):指上圖的橙黃色部分。表示頁面已分配的記錄空間,也是索引資料的真正儲存區域。記錄堆分為兩種,即有效記錄和已刪除記錄。有效記錄就是索引正常使用的記錄,而已刪除記錄表示索引已經刪除,不在使用的記錄,如上圖的深藍色部分。隨著記錄的更新和刪除越來越頻繁,記錄堆中已刪除記錄將會越多,即會出現越來越多的空洞(碎片)。這些已刪除記錄連線起來,就會成為頁面的自由空間連結串列。
- 未分配空間:指頁面未使用的儲存空間,隨著頁面不斷使用,未分配空間將會越來越小。當新插入一條記錄時,首先嚐試從自由空間連結串列中獲得合適的儲存位置(空間足夠),如果沒有滿足的,就會在未分配空間中申請。
- slot區:slot是一些頁面有效記錄的指標,每個slot佔兩個位元組,儲存了記錄相對頁面首地址的偏移。如果頁面有n條有效記錄,那麼slot的數量就在n/8+2~n/4+2之間。下一節詳細介紹slot區,它是記錄頁面有序和二分查詢的關鍵。
- 頁尾(Page Tailer):頁面最後部分,佔8個位元組,主要儲存頁面的校驗資訊。
頁面中的頁頭,最大/最小虛記錄以及頁尾都是頁面中有固定的儲存位置。
InnoDB的索引結構
InnoDB使用B+Tree的方式儲存索引。
Innodb的一個表可能包含多個索引,每個索引都使用B+樹來儲存。而索引包括聚集索引和二級索引,聚集索引使用表的主鍵作為索引鍵,包含表的所有欄位。二級索引只包含索引鍵和聚集索引鍵(主鍵)的內容,不包括其他欄位。每一個索引都是一棵B+樹,每棵B+樹由很多頁面組成,而每個頁面大小一般為16K。從B+樹的組織結構來看,B樹的頁面可分為:
葉子節點:B樹層次為0的頁面,儲存記錄的所有內容。
非葉子節點:B樹層次大於0的頁面,只儲存索引鍵和頁面指標。
一棵典型的B+樹結構:
從上圖可知,相同層次的頁面是用一個雙向連結串列連線起來的。
一般情況下,從B+樹的最左邊葉子節點開始,一直向右掃描,就可以得到B+樹的從小到大的所有資料。因此,對於葉子節點,有如下特徵:
頁內資料是按索引鍵排序的。
頁面的任一記錄的索引鍵值不小於其左兄弟頁面的任何記錄。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。