在InnoDB中,數據存儲在磁碟上,處理數據時需要先將數據從磁碟讀取,再寫到記憶體。InnoDB採用局部性原理載入。 一、局部性原理 從磁碟讀取數據時,不需要一行一行讀取,而是以頁為單位讀取,操作系統中一頁4kb,InnoDB中一頁16kb。 二、InnoDB頁結構 頁是InnoDB管理存儲空間的基本 ...
在InnoDB中,數據存儲在磁碟上,處理數據時需要先將數據從磁碟讀取,再寫到記憶體。InnoDB採用局部性原理載入。
一、局部性原理 從磁碟讀取數據時,不需要一行一行讀取,而是以頁為單位讀取,操作系統中一頁4kb,InnoDB中一頁16kb。 二、InnoDB頁結構 頁是InnoDB管理存儲空間的基本單位,一個頁的大小預設是16KB。三、InnoDB行格式
我們可以在創建或修改表的語句中指定行格式:
CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名稱 ALTER TABLE 表名 ROW_FORMAT=行格式名稱1、Compact行格式:
(1)變長欄位長度列表
MySQL支持一些變長的數據類型,比如VARCHAR(M)、VARBINARY(M)、TEXT類型,BLOB類型,這些數據類型修飾列稱為變長欄位。變長欄位長度列表即所有變長欄位的真實數據占用的位元組長度構成的列表。
VARCHAR(M),M代表最大能存多少個字元。
(2)NULL標誌位(列表) Compact行格式會把可以值為NULL的列統一管理起來,存一個二進位標記(1為NULL,0不為NULL)在NULL標誌位中,如果表中沒有允許存儲 NULL 的列,則 NULL值列表也不存在了。如:第一行沒有null:11111
第二行前三位null:22 (null標誌位:11100)
(3)記錄頭信息
記錄頭信息用於描述記錄,它是由固定的5個位元組組成。 5個位元組也就是40個二進位位,不同的位代表不同的意思,如圖:
(4)記錄的真實數據
記錄的真實數據除了我們自己定義的列的數據以外,還會有三個隱藏列:
2.行溢出數據
VARCHAR(M)類型的列最多可以占用65535個位元組。 如果我們使用 ascii字元集的話,一個字元就代表一個位元組。但是VARCHAR(65535)會報錯:
原因:存儲一個VARCHAR(M)類型的列,其實需要占用3部分存儲空間: 1. 真實數據 2. 變長欄位真實數據的長度 3. NULL值標識
因此,如果該VARCHAR類型的列沒有NOT NULL屬性,那最多只能存儲65532個位元組的數據,因為變長欄位的長度占用 2個位元組,NULL值標識需要占用1個位元組。
3.行過長導致的頁溢出
一個頁的大小一般是16KB,也就是16384位元組,而一個VARCHAR(M)類型的列就最多可以存儲65533個位元組,這 樣就可能出現一個頁存放不了一條記錄。
(1)在Compact和Reduntant行格式中,對於占用存儲空間非常大的列,在記錄的真實數據處只會存儲該列的一部分 數據,把剩餘的數據分散存儲在幾個其他的頁中,然後記錄的真實數據處用20個位元組存儲指向這些頁的「地址和位元組數」,從而可以找到剩餘數據所在的頁。
...
(2)在Dynamic和Compressed行格式中,它們不會在記錄的真實數據處 存儲一部分數據,而是把所有的數據都存儲到其他頁面中,只在記錄的真實數據處存儲其他頁面的地址。
...
4.Dynamic和Compressed行格式
這兩種行格式類似於COMPACT行格式,只不過在處理行溢出數據時有點區別,如上。另外, Compressed行格式會採用壓縮演算法對頁面進行壓縮。