溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

【MYSQL】InnoDB行溢出數(shù)據(jù)說明

發(fā)布時(shí)間:2020-08-11 21:20:11 來源:ITPUB博客 閱讀:289 作者:ai3707 欄目:MySQL數(shù)據(jù)庫
    首先說下MySQL數(shù)據(jù)庫的varchar字段,真的很實(shí)用,它可以存放65536字節(jié)的數(shù)據(jù),比oracle和sqlserver大多了,但是在使用varchar時(shí)也有幾點(diǎn)要注意;

    1、65536只是這么說,要建表的時(shí)候指定一個(gè)字段65536仍然會(huì)報(bào)錯(cuò),因?yàn)樽侄伪旧磉€有其他開銷,實(shí)際只能存放65532字節(jié)。
    2、65532字節(jié)并不是每個(gè)varchar字段都可以設(shè)置的,他是一個(gè)總和,也就是說如果有2個(gè)varchar字段的表,那么每個(gè)varchar字段只能設(shè)置65532/2的值。
    3、建表時(shí)要注意編碼格式哦,varchar(65532)代表的是字節(jié)數(shù),如果使用GBK或者UTF-8那就無法建立成功了,因?yàn)镚BK一個(gè)字符占用2字節(jié),UTF-8一個(gè)字符占用3字節(jié)
    以上概念比較簡單,大家建個(gè)表試驗(yàn)一下就好,這里不再做實(shí)驗(yàn);大家知道,頁(PAGE)innoDB存儲(chǔ)引擎的最小存儲(chǔ)單位,默認(rèn)大小為16KB,及16384字節(jié),行數(shù)據(jù)存儲(chǔ)在頁中;那么一行數(shù)據(jù)如果超過了一個(gè)頁能夠存儲(chǔ)的大小怎么辦?比如上面說的varchar(65532),65532字節(jié)該如何存儲(chǔ)?這個(gè)時(shí)候就會(huì)發(fā)生行溢出。

行溢出
    InnoDB存儲(chǔ)引擎可以將一條記錄中的某些數(shù)據(jù)存儲(chǔ)在真正的數(shù)據(jù)頁面之外,一般為BLOB\LOB這類的大對(duì)象列類型。但是也不是絕對(duì),BLOB可以不將數(shù)據(jù)放在溢出頁面,而且即便是VARCHAR列數(shù)據(jù)類型,依然有可能被存放為行溢出數(shù)據(jù),比如上例

    我們執(zhí)行:insert into 表名 select repeat('a',65532),就將一行65532字節(jié)的數(shù)據(jù)插入到表中了,實(shí)際上在底層,真正的數(shù)據(jù)頁只存儲(chǔ)了一小部分?jǐn)?shù)據(jù),之后是偏移量,指向行溢出數(shù)據(jù),這時(shí)會(huì)產(chǎn)生N個(gè)未壓縮的二進(jìn)制大對(duì)象頁 Uncompressed BLOB Page,這些大對(duì)象頁中才是完整存放了65532字節(jié)的數(shù)據(jù)。

    那么,一行數(shù)據(jù)為多大時(shí),會(huì)發(fā)生行溢出呢?我們知道InnoDB存儲(chǔ)引擎表是索引組織的,即B+樹結(jié)構(gòu),這樣一個(gè)頁中至少要保證有2條數(shù)據(jù),否則就變成鏈表了,如果只能存放一條數(shù)據(jù),那么InnoDB存儲(chǔ)引擎會(huì)自動(dòng)將它存放在溢出頁中。如果可以在一個(gè)頁中至少放入兩行數(shù)據(jù),那么就不會(huì)發(fā)生行溢出
    
    其實(shí)對(duì)于BLOB類型的數(shù)據(jù),跟varchar也是一個(gè)道理,要看實(shí)際的大小,當(dāng)然,用戶既然使用了blob列類型,一般不可能存放長度過小的數(shù)據(jù),因此在大多數(shù)情況下BLOB的行數(shù)據(jù)還是會(huì)發(fā)生行溢出,實(shí)際數(shù)據(jù)保存在BLOB頁中,數(shù)據(jù)頁只保存數(shù)據(jù)的前768字節(jié)。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI