InnoDB 將數(shù)據(jù)劃分為若干個頁伏尼,以頁作為磁盤和內(nèi)存之間交互的基本單位漏益,InnoDB中頁大小一般為16KB奴饮。
系統(tǒng)變量
innodb_page_size
表明了InnoDB存儲引擎中的頁大小薄坏,默認(rèn)值為16384字節(jié)燕偶,該變量只能在第一次初始化MySQL數(shù)據(jù)目錄指定侵浸,之后不能修改了旺韭。
InnoDB 記錄格式
COMPACT,REDUNDANT掏觉,DYNAMIC区端,COMPRESSED
可以在創(chuàng)建表指定使用的行格式
CREATE TABLE demo (
c1 VARCHAR(10),
c2 VARCHAR(10) NOT NULL,
c3 CHAR(10),
c4 VARCHAR(10)
) CHARSET=ascii ROW_FORMAT=COMPACT;
或者修改表的語句中指定使用的行格式
ALTER TABLE 表名 ROW_FORMAT=行格式名稱;
COMPACT 格式
先插入2組數(shù)據(jù):
SELECT * FROM demo;
+---------+---------+---------+---------+
| c1 c2 c3 c4 |
+---------+---------+---------+---------+
| aaaa bbb cc d |
| eeee fff NULL NULL |
+---------+---------+---------+---------+
-
變長字段長度列表
MySQL 支持一些變長的數(shù)據(jù)類型,比如VARCHAR澳腹,VARBINARY织盼,各種TEXT類型,各種BLOB類型酱塔。這些數(shù)據(jù)列我們稱之為變長字段沥邻。變長字段中存儲多少字節(jié)的數(shù)據(jù)是不固定的,所以我們在存儲真實數(shù)據(jù)的時候需要順便把這些數(shù)據(jù)占用的字節(jié)數(shù)也存儲起來羊娃。compact 行格式中唐全,將其放在放在 變長字段長度列表中,各變長字段的真實數(shù)據(jù)占用按照列的順序逆序存放蕊玷。
變長字段列為 c1 c2 c4邮利,按照列的順序逆序存放,所以第一條記錄的變長字段長度就是:01 03 04
-
NULL 值列表
一條記錄中某些列可能存儲NULL值垃帅,如果把這些NULL值都放到記錄的真實數(shù)據(jù)中存儲會很占地方延届,COMPACT 行格式把一條記錄中值為NULL的列統(tǒng)一管理起來,存儲到NULL值列表中贸诚,它的處理過程如下:首先統(tǒng)計表中允許存儲NULL的列有哪些 方庭?
主鍵列以及使用NOT NULL
修飾的列都是不可以存儲 NULL 的值,所以在統(tǒng)計時不會把這些列算進(jìn)去酱固。上面就是c1械念,c3,c4列媒怯。-
如果表中沒有允許存儲NULL的列订讼,則NULL值列表也就不存在了,否則將每個允許存儲NULL的列對應(yīng)一個二進(jìn)制位扇苞,二進(jìn)制位為1表示該列的值為NULL欺殿,否則表示不為NULL寄纵。同時MySQL 規(guī)定NULL值列表必須用整數(shù)各字節(jié)的位表示,如果使用的二進(jìn)制位個數(shù)不是整數(shù)個字節(jié)脖苏,則在字節(jié)的高位補(bǔ)0
所以上面的2條記錄NULL 值列表如下:
-
記錄頭信息
記錄頭信息由固定的 5 字節(jié)組成程拭,用于描述記錄的一些屬性。名稱 大小 描述 預(yù)留位1 1 沒有使用 預(yù)留位2 1 沒有使用 deleted_flag 1 標(biāo)記該記錄是否被刪除 min_re_flag 1 B+樹的每層非葉子節(jié)點(diǎn)中最小的目錄項都會添加該標(biāo)記 n_owned heap_no record_type next_record -
記錄的真實數(shù)據(jù)
對于表來說棍潘,記錄的真實數(shù)據(jù)除了自己定義的外恃鞋,MySQL還會為每個記錄默認(rèn)添加一些列(也稱為隱藏列)。名稱 是否必需 占用空間 描述 row_id 否 6字節(jié) 行ID亦歉,唯一標(biāo)識一條記錄 trx_id 是 6字節(jié) 事務(wù)ID roll_pointer 是 7字節(jié) 回滾指針 - InnoDB 主鍵生成策略
- 優(yōu)先使用用戶自定義的主鍵為主鍵恤浪。
- 如果用戶沒有定義主鍵,則選取一個不允許存儲 NULL 值的 UNIQUE 健作為主鍵肴楷。
- 如果表中連不允許存儲 NULL 值的 UNIQUE 健都沒有水由,則InnoDB則會為表默認(rèn)添加一個
row_id
的隱藏列作為主鍵。
- InnoDB 主鍵生成策略
CHAR(M)列的存儲格式
對于CHAR(M)類型的列來說赛蔫,當(dāng)列采用的是定長編碼的字符集時砂客,該列占用的字節(jié)數(shù)不會被加到變長字段長度列表中,但是如果采用變長編碼的字符集時呵恢,該列占用的字節(jié)數(shù)還是會被加到變長字段長度列表鞠值。溢出列
REDUNDANT
過時了,這里不分析渗钉。
DYNAMIC
DYNAMIC彤恶, COMPRESSED和 COMPACT 格式挺像的,只不過在處理溢出列的時候晌姚。
COMPRESSED
不同于DYNAMIC粤剧,COMPRESSED 行格式會采用壓縮算法對頁面進(jìn)行壓縮,以節(jié)省空間挥唠。