簡述Mysql的一些問題(持續(xù)學習中小林圖解mysql中)
1.Mysql的null值是如何存放的?
mysql的compact行格式會把值為null的列存儲到null值列表中。NULL 值列表也不是必須的。當數(shù)據表的字段都定義成 NOT NULL 的時候,這時候表里的行格式就不會有 NULL 值列表了。這樣可以至少節(jié)省 1 字節(jié)的空間(NULL 值列表至少占用 1 字節(jié)空間)。但是null值列表并不是固定的1字節(jié)空間。當有一條記錄有9個字段值都是null,就會創(chuàng)建2字節(jié)空間的null值列表,以此類推。
2.mysql怎么知道varchar(n)實際占用數(shù)據的大???
mysql的compact行格式中會使用 變長字段長度列表 存儲變長字段實際占用的數(shù)據大小。
3.varchar(n)中的n最大取值是多少?
varchar(n)?中?n?的最大取值與 MySQL 的版本、行格式以及字符集有關:
- 早期版本:在 MySQL 5.0.3 之前,varchar?類型的最大長度為 255 字節(jié)。
- 之后版本:在 MySQL 5.0.3 及以后版本,一行記錄最大可以存儲65535字節(jié)的數(shù)據,但是這個是包含 變長字段字節(jié)數(shù)列表占用的字節(jié)數(shù) 和 null值列表所占用的字節(jié)數(shù),因此在算varchar(n)中n的最大值時,需要減去這兩個列表所占用的字節(jié)數(shù)。
如果一張表只有一個 varchar(n) 字段,且允許為 null,字符集為 asci。varchar(n)中n最大取值為 65532。
計算公式:65535-變長字段字節(jié)數(shù)列表所占用的字節(jié)數(shù)-null值列表所占用的字節(jié)數(shù)=65535-2-1=65532。
如果有多個字段的話,要保證所有字段的長度+變長字段字節(jié)數(shù)列表所占用的字節(jié)數(shù) + NULL值列表所占用的字節(jié)數(shù)<= 65535。
4.行溢出后,mysql是怎么處理的?
如果一個數(shù)據也存不了一條記錄,InnoDB存儲引擎會自動將溢出的數(shù)據存放到 溢出頁 中。
compact行格式對行溢出的處理是這樣的:當發(fā)生行溢出時,在記錄的真實數(shù)據處只會保存該列的一部分數(shù)據,而把剩余的數(shù)據存放在溢出頁中,然后真實的數(shù)據處用20字節(jié)存儲指向溢出頁的地址,從而可以找到剩余數(shù)據所在的頁。
Compressed 和 Dynamic 這兩種格式采用完全的行溢出方式,記錄的真實數(shù)據處不會存儲該列的一部分數(shù)據,只存儲 20 個字節(jié)的指針來指向溢出頁。而實際的數(shù)據都存儲在溢出頁中。
#mysql#