中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

【MYSQL】InnoDB行溢出數據說明

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

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

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

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

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洪洞县| 凉城县| 桦南县| 武穴市| 易门县| 临潭县| 巴楚县| 乳山市| 建昌县| 郴州市| 阳曲县| 广水市| 庆阳市| 东丰县| 汝阳县| 南华县| 高台县| 和顺县| 新干县| 聂拉木县| 宁陕县| 呼图壁县| 侯马市| 嘉义县| 靖州| 怀柔区| 五家渠市| 武山县| 凤冈县| 上思县| 内黄县| 邢台县| 仲巴县| 渑池县| 房山区| 湘潭县| 永济市| 孝昌县| 玉田县| 漳平市| 浪卡子县|