Mysql中Row size too large (> 8126) 錯(cuò)誤的問題解決
問題發(fā)現(xiàn)
今天在導(dǎo)入他人項(xiàng)目中的sql數(shù)據(jù)庫文件時(shí),出現(xiàn)一個(gè)mysql的錯(cuò)誤提示,大致描述是:Row size too large (> 8126)
,英文不算好的我看字面意思,估摸著大概就是說我們插入的行數(shù)據(jù)可能太大了,超過了設(shè)定的闕值;
一、問題導(dǎo)致的可能原因
這個(gè)限制主要是因?yàn)?code>MySQL內(nèi)部存儲(chǔ)機(jī)制的約束,MySQL的InnoDB存儲(chǔ)引擎
有一個(gè)最大行大小限制
關(guān)于mysql引擎內(nèi)容比較多,以后再專門寫一篇內(nèi)容好好說說;這里我們只需要知道他是目前mysql 默認(rèn)的存儲(chǔ)引擎就好啦;
而這個(gè)最大行大小限制
主要由于幾個(gè)因素影響:
1、頁大小
頁是InnoDB管理數(shù)據(jù)的最小單位,InnoDB使用16KB的頁來存儲(chǔ)數(shù)據(jù),行數(shù)據(jù)在進(jìn)行保存插入的時(shí)候,要求我們的單行數(shù)據(jù)不能跨越多于半個(gè)頁(8KB)。否則數(shù)據(jù)庫會(huì)自動(dòng)按照是否進(jìn)行溢出頁的機(jī)制來處理數(shù)據(jù);簡(jiǎn)單說的話,其實(shí)就是數(shù)據(jù)庫中的每行數(shù)據(jù)我們可以看作是一所個(gè)人專屬的小房子,里面預(yù)留了一個(gè)固定的空間給他們放東西,如果放入的東西太多了,超過這個(gè)空間大小,屋主就會(huì)考慮是否可以把東西放在屋外,來保障空間不至于太過擁擠
,這里的房間內(nèi)的空間就是頁內(nèi)空間大小,房外就是多出的
2、行格式
InnoDB支持幾種行格式,如compact、redundant、dynamic和compressed。其中,dynamic和compressed格式是為了解決行大小限制而引入的,允許行中的某些列(如BLOB和TEXT類型)存儲(chǔ)在頁外。
這點(diǎn)簡(jiǎn)單的來說,四種行格式可以看作是房屋管理辦法四個(gè)準(zhǔn)則,每個(gè)準(zhǔn)則都有各自適用的場(chǎng)景和優(yōu)點(diǎn);
關(guān)于行格式,我們這里只需要知道有哪幾種,以及他們數(shù)據(jù)存儲(chǔ)方式,各自應(yīng)用場(chǎng)景即可;
2.1 compact格式
InnoDB的默認(rèn)行格式,也是最常用常見的格式;采取的是位圖壓縮
的存儲(chǔ)方式;適用于大多數(shù)OLTP(在線事務(wù)處理
應(yīng)用場(chǎng)景。OLTP其實(shí)就是指那種較高并發(fā),并且要求低延遲,專注業(yè)務(wù)操作的應(yīng)用,類似銀行交易、訂單處理、庫存更新那些情況比較常用;
2.2 Redundant格式
MySQL 5.0以前的默認(rèn)行格式
;適用具有大量NULL值的表;
2.3 Dynamic格式
從 MySQL 5.6.3 開始,默認(rèn)的行格式是 DYNAMIC,Dynamic行格式具有高度的靈活性,可以動(dòng)態(tài)地調(diào)整行的大小和存儲(chǔ)方式
?;趯?shí)際數(shù)據(jù)長(zhǎng)度大小來進(jìn)行調(diào)整存儲(chǔ)空間,以節(jié)省存儲(chǔ)空間;適用于包含大量長(zhǎng)度可變列的表,例如包含TEXT、BLOB等大型字段的表。
2.4 Compressed格式
Compressed行格式采用壓縮存儲(chǔ)方式
,它適用于存儲(chǔ)大量重復(fù)數(shù)據(jù)或較大的表
。Compressed行格式使用多種壓縮算法,如Zlib和LZO等,能夠顯著減少磁盤I/O操作,提高存儲(chǔ)和讀取性能
3、BLOB和TEXT列
這點(diǎn)因素與上面那點(diǎn)有關(guān),Blob 和 Text 是mysql中的大數(shù)據(jù)存儲(chǔ)類型,但是在我們不設(shè)置行模式為ynamic和compressed
的時(shí)候,這些列通常存儲(chǔ)在頁外,但它們的元數(shù)據(jù)(如長(zhǎng)度)仍然存儲(chǔ)在行內(nèi),而這個(gè)存儲(chǔ)的大小
跟行格式的設(shè)置
會(huì)有所不同。也就是說明他會(huì)計(jì)入行大小限制的計(jì)算
;
二、解決辦法
好了,既然知道問題原因的可能了,現(xiàn)在就是開始如何解決了;
1、修改頁大?。ú煌扑])
雖然mysql InnoDB的引擎默認(rèn)的頁大小是16KB,但是這個(gè)值并不是不能修改,修改配置文件;
添加或修改innodb_page_size
參數(shù)來設(shè)置新的頁大小。例如,innodb_page_size = 16384(以字節(jié)為單位,對(duì)應(yīng)16KB)
,或者設(shè)置的更大;不過需要注意的是:
頁大小的調(diào)整最好是在數(shù)據(jù)庫初始化的初期去設(shè)置,一旦數(shù)據(jù)庫初始化完成后,就不建議更改了,這種情況下意味著你原來已經(jīng)存在的所有ibdata和ib_logfile文件都需要重建,那就不是很合適了,而且這樣做也可能會(huì)帶來一定的性能影響;
2、修改行格式
既然dynamic和compressed行格式就是為了解決行大小限制而引入的,我們可以修改該格式即可;當(dāng)然了,我們也不是都要去修改這個(gè),這個(gè)也是和我們的mysql版本有關(guān)的;
從 MySQL 5.6.3 開始,默認(rèn)的行格式是 DYNAMIC
,也就是說,其實(shí)在這個(gè)版本之后的我們其實(shí)就不需要修改行格式了;
不過如果你和博主一樣是通過導(dǎo)入sql文件的方式創(chuàng)建的表的話,需要確認(rèn)你的sql文件中是否有另外定義行格式;例如:
博主雖然數(shù)據(jù)庫是8.0+,默認(rèn)行模式已經(jīng)是DYNAMIC,但是對(duì)方給的sql文件創(chuàng)建表的語句中指定了Compact行格式,這個(gè)原因大概率是因?yàn)樗趯?dǎo)出時(shí)候環(huán)境是基于mysql5.x,而博主是8.0+的,所以這里導(dǎo)出的時(shí)候會(huì)有所出入;這里我講所有的行模式設(shè)置都去掉了,默認(rèn)就會(huì)按照DYNAMIC設(shè)置,就不會(huì)報(bào)錯(cuò)了;因此我們?cè)谧霾煌姹緈ysql的數(shù)據(jù)導(dǎo)入與導(dǎo)出時(shí),需要特別小心版本不同帶來的影響
3、修改數(shù)據(jù)類型為BLOB和TEXT列
如果你本來該字段就會(huì)需要存儲(chǔ)較大的數(shù)據(jù),就應(yīng)該用blob和text來替換原來的數(shù)據(jù)類型VARCHAR或CHAR,這樣能讓數(shù)據(jù)大部分存儲(chǔ)在溢出頁中,而不去納入大小限制的值計(jì)算;而如果我們之前設(shè)置了行模式的話,這個(gè)納入計(jì)算的值占用會(huì)更??;
4、其他優(yōu)化方式(可以參考使用)
4.1 合理設(shè)置數(shù)據(jù)類型大小
在進(jìn)行表設(shè)計(jì)時(shí)候,一些列字段我們根據(jù)實(shí)際需要設(shè)計(jì),例如varchar數(shù)據(jù)類型,如果實(shí)際存儲(chǔ)值不大,長(zhǎng)度就定義足夠空間大小即可(即能用varchar64就不用varchar128,能用128就不要用256,盡可能合理分配空間);
4.2 合理進(jìn)行表結(jié)構(gòu)設(shè)計(jì)
如果設(shè)計(jì)表的時(shí)候,單表列盡量不要太多,適當(dāng)?shù)倪M(jìn)行拆表將列分出去,也能在一定橫渡上避免問題;
4.3 更換存儲(chǔ)引擎
換另一種存儲(chǔ)引擎,這個(gè)方法的話見仁見智,要根據(jù)自己的業(yè)務(wù)場(chǎng)景來抉擇了,比如MyISAM引擎最大的缺點(diǎn)就是它不支持事務(wù)和高并發(fā),所以才使得大多數(shù)情況下我們?nèi)匀辉谟肐nnoDB引擎的原因,雖然它讀寫性能上并沒有前者優(yōu)秀;
到此這篇關(guān)于Mysql中Row size too large (> 8126) 錯(cuò)誤的問題解決的文章就介紹到這了,更多相關(guān)Mysql Row size too large (> 8126) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql中varchar類型的日期進(jìn)行比較、排序等操作的實(shí)現(xiàn)
在mysql使用過程中,日期一般都是以datetime、timestamp等格式進(jìn)行存儲(chǔ)的,但有時(shí)會(huì)因?yàn)樘厥獾男枨蠡驓v史原因,日期的存儲(chǔ)格式是varchar,那么應(yīng)該怎么進(jìn)行比較和排序等問題,本文就來介紹一下2021-11-11MySQL DISTINCT 的基本實(shí)現(xiàn)原理詳解
這篇文章主要介紹了MySQL DISTINCT 的基本實(shí)現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07分析Mysql表讀寫、索引等操作的sql語句效率優(yōu)化問題
今天小編就為大家分享一篇關(guān)于分析Mysql表讀寫、索引等操作的sql語句效率優(yōu)化問題,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12MySQL asc、desc數(shù)據(jù)排序的實(shí)現(xiàn)
這篇文章主要介紹了MySQL asc、desc數(shù)據(jù)排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12windows2008 64位系統(tǒng)下MySQL 5.7綠色版的安裝教程
這篇文章主要給大家分享了在windows2008 64位系統(tǒng)下MySQL 5.7綠色版的安裝教程,文中將安裝步驟介紹的非常詳細(xì),相信會(huì)對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05