在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行格式會采用壓縮演算法對頁面進行壓縮,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/64462.html
標籤:MySQL
上一篇:mysql入門(三)
下一篇:簡單SQL陳述句
