InnoDB引擎的索引和儲存結構

2022-01-18 00:04:02 字數 3156 閱讀 2480

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

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

mysql預設的儲存引擎是myisam,其他常用的就是innodb,另外還有merge、memory(heap)等。

(1)主要的幾個儲存引擎

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

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

(2)不同儲存引擎的橫向對比

特點myisam

bdbmemory

innodb

儲存限制

沒有沒有

有64tb

事務安全

支援支援

鎖機制表鎖

頁鎖表鎖

行鎖b樹索引

支援支援

支援支援

雜湊索引

支援支援

全文索引

支援集群索引

支援資料快取

支援支援

索引快取

支援支援

支援資料可壓縮

支援空間使用低低

n/a高

記憶體使用低低

中等高批量插入的速度高高

高低支援外來鍵

支援(3)檢視和配置儲存引擎的操作

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

2.要檢視表的定義結構等資訊可以使用以下幾種命令:12

3desc[ribe] tablename; //檢視資料表的結構

showcreatetabletablename; //顯示表的建立語句,可以檢視建立表時指定的engine

showtablestatuslike『tablename』\g顯示表的當前狀態值

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

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

34createtabletablename(

columnname(列名1) type(資料型別) attri(屬性設定),

columnname(列名2) type(資料型別) attri(屬性設定),

……..) engine = enginename

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

1altertabletablename engine =enginename

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

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

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

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

2. 最小虛記錄、最大虛記錄:兩個固定位置儲存的虛記錄,本身並不儲存資料。最小虛記錄比任何記錄都小,而最大虛記錄比任何記錄都大。

3. 記錄堆(record heap):指上圖的橙黃色部分。表示頁面已分配的記錄空間,也是索引資料的真正儲存區域。記錄堆分為兩種,即有效記錄和已刪除記錄。有效記錄就是索引正常使用的記錄,而已刪除記錄表示索引已經刪除,不在使用的記錄,如上圖的深藍色部分。隨著記錄的更新和刪除越來越頻繁,記錄堆中已刪除記錄將會越多,即會出現越來越多的空洞(碎片)。這些已刪除記錄連線起來,就會成為頁面的自由空間鍊錶。

4. 未分配空間:指頁面未使用的儲存空間,隨著頁面不斷使用,未分配空間將會越來越小。當新插入一條記錄時,首先嘗試從自由空間鍊錶中獲得合適的儲存位置(空間足夠),如果沒有滿足的,就會在未分配空間中申請。

5. slot區:slot是一些頁面有效記錄的指標,每個slot佔兩個位元組,儲存了記錄相對頁面首位址的偏移。如果頁面有n條有效記錄,那麼slot的數量就在n/8+2~n/4+2之間。下一節詳細介紹slot區,它是記錄頁面有序和二分查詢的關鍵。

6. 頁尾(page tailer):頁面最後部分,佔8個位元組,主要儲存頁面的校驗資訊。

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

innodb使用b+tree的方式儲存索引。

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

葉子節點:b樹層次為0的頁面,儲存記錄的所有內容

非葉子節點:b樹層次大於0的頁面,只儲存索引鍵和頁面指標。

一棵典型的b+樹結構:

從上圖可知,相同層次的頁面是用乙個雙向鍊錶連線起來的。

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

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

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

參考 mysql效能優化總結

mysql核心解析:innodb頁面儲存結構

InnoDB儲存引擎(四)索引

在本篇部落格中,我將介紹資料索引的原理 實現。innodb支援三種索引 聚集索引特點 聚集索引優點 非聚集索引特點 該值表示某個表的字段是否具有高選擇性,用來看是否應該建立索引。比如性別這種,是低選擇性的,取值範圍只有2個,而記錄有成千上萬條,為性別建立索引是沒有必要的。相反,如果取值範圍很大,ca...

MySql的InnoDB儲存引擎 索引

索引分類 1 聚集索引 索引順序與物理順序一致。mysql 的 innodb 中,主鍵索引就是聚集索引。好處是,進行搜尋的時候,因為索引和物理順序一致,所以找資料的時候更快。2 非聚集索引 索引順序與物理順序不一致。非主鍵索引。在非主鍵索引中,又有組合索引 最左索引 也就是查詢的時候如果where條...

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

前言 在oracle 和sql server等資料庫中只有一種儲存引擎,所有資料儲存管理機制都是一樣的。而mysql資料庫提供了多種儲存引擎。使用者可以根據不同的需求為資料表選擇不同的儲存引擎,使用者也可以根據自己的需要編寫自己的儲存引擎。mysql主要儲存引擎的區別 mysql預設的儲存引擎是my...