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),每條記錄有最大長(zhǎng)度的。MySQL的官方文檔:
鏈接:https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html#row-size-limits
?在MySQL innodb中,所有的數(shù)據(jù)都是按頁(yè)(page)來(lái)操作的,一頁(yè)就是16KB(默認(rèn)的),采用B+樹(shù)作為索引,B+樹(shù)中每個(gè)節(jié)點(diǎn)都是16KB,在最底層的每個(gè)葉子節(jié)點(diǎn)中存儲(chǔ)數(shù)據(jù),以主鍵索引為例,如果每個(gè)葉子節(jié)點(diǎn)為16KB,那么一行數(shù)據(jù)超過(guò)16KB時(shí),就會(huì)出現(xiàn)行溢出,溢出的數(shù)據(jù)放到另一個(gè)page中,即uncompresse blob page
但是在B+樹(shù)中,每個(gè)葉子節(jié)點(diǎn)page中至少存儲(chǔ)2行數(shù)據(jù),否則就失去了意義。那么一行數(shù)據(jù)的長(zhǎng)度就是小于8KB,在一行數(shù)據(jù)長(zhǎng)度超過(guò)8KB時(shí),innodb將會(huì)將剩余的部分?jǐn)?shù)據(jù)寫(xiě)出到另一個(gè)溢出頁(yè)中,該列的前768字節(jié)存放在該頁(yè)中,同時(shí)有個(gè)偏移指向溢出頁(yè)。
官方給出的解決方式:
1.垂直表字段拆分或者大字段合并(大字段最多不超過(guò)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每行数据长度的限制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: GJB289A总线测试工装研究
- 下一篇: 7月29日绝地求生服务器维护,绝地求生7