MySQL innodb每行数据长度的限制
今天在使用MySQL innodb時(shí),create table時(shí),報(bào)出這樣的一個(gè)錯(cuò)誤:
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs
查閱MySQL的官方資料才發(fā)現(xiàn),每條記錄有最大長度的。MySQL的官方文檔:
鏈接:https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html#row-size-limits
?在MySQL innodb中,所有的數(shù)據(jù)都是按頁(page)來操作的,一頁就是16KB(默認(rèn)的),采用B+樹作為索引,B+樹中每個(gè)節(jié)點(diǎn)都是16KB,在最底層的每個(gè)葉子節(jié)點(diǎn)中存儲(chǔ)數(shù)據(jù),以主鍵索引為例,如果每個(gè)葉子節(jié)點(diǎn)為16KB,那么一行數(shù)據(jù)超過16KB時(shí),就會(huì)出現(xiàn)行溢出,溢出的數(shù)據(jù)放到另一個(gè)page中,即uncompresse blob page
但是在B+樹中,每個(gè)葉子節(jié)點(diǎn)page中至少存儲(chǔ)2行數(shù)據(jù),否則就失去了意義。那么一行數(shù)據(jù)的長度就是小于8KB,在一行數(shù)據(jù)長度超過8KB時(shí),innodb將會(huì)將剩余的部分?jǐn)?shù)據(jù)寫出到另一個(gè)溢出頁中,該列的前768字節(jié)存放在該頁中,同時(shí)有個(gè)偏移指向溢出頁。
官方給出的解決方式:
1.垂直表字段拆分或者大字段合并(大字段最多不超過768,業(yè)務(wù)進(jìn)行合并+拆分)
2.修改表的存儲(chǔ)引擎,modify InnoDB to MyISAM.
3.修改row_format為COMPRESSED或者DYNAMIC,當(dāng)然前提需保證innodb_file_format =Barracuda.
?
總結(jié)
以上是生活随笔為你收集整理的MySQL innodb每行数据长度的限制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GJB289A总线测试工装研究
- 下一篇: mysql开启慢查询日志及查询--win