增加MySql Innodb行长度以避免错误139

时间:2011-01-14 07:18:38

标签: mysql innodb mysql-error-1030

我在MySql(Innodb引擎)中创建了一个包含超过15个TEXT数据类型列的表。创建表后,我试图在这个表中插入一行,所有列中的字符数超过500个。这样做时,mysql会返回以下错误,

[错误代码:1030,SQL状态:HY000]从存储引擎

收到错误139

搜索时,我发现mysql中的行长度限制为8000字节。我想知道是否可以将此限制配置(通过参数或甚至编译代码)到所需级别。我看到一些关于innodb插件的链接解决了这个问题,但我无法对此有所了解。我在Windows中尝试这个。

非常感谢任何帮助。

谢谢, 阿肖克。

3 个答案:

答案 0 :(得分:3)

InnoDB中要求一个页面(16k)必须包含至少两个记录。如果你减去开销,你就会得到每个记录限制近8k。

BLOB / TEXT类型可以更长,InnoDB根据行格式以不同的方式处理它们。

对于压缩COMPACT,规则如下。如果记录长于~8k,则页面存储BLOB字段的前768个字节。该字段的剩余部分存储在一系列外部页面中。 15个BLOB字段每个500字节+其他开销超过每条记录约8k的限制。

DYNAMIC格式针对BLOB进行了优化。限制相同,每条记录约8,000。但是如果记录超过限制,则仅存储对外部页面的引用(它的20个字节)。 BLOB值仅存储在外部页面中。因此,一条记录可能包含更多BLOB字段。

DYNAMIC行格式仅以Barracuda文件格式提供。别忘了在my.cnf中启用它:

innodb_file_per_table=ON
innodb_file_format=Barracuda

要解决您的问题,您必须以DYNAMIC格式创建表格。

CREATE TABLE testtext 
  ( 
     id     INTEGER, 
     text1  TEXT, 
     text2  TEXT, 
     text3  TEXT, 
     text4  TEXT, 
     text5  TEXT, 
     text6  TEXT, 
     text7  TEXT, 
     text8  TEXT, 
     text9  TEXT, 
     text10 TEXT, 
     text11 TEXT, 
     text12 TEXT, 
     text13 TEXT, 
     text14 TEXT, 
     text15 TEXT, 
     text16 TEXT, 
     text17 TEXT, 
     text18 TEXT, 
     text19 TEXT, 
     text20 TEXT, 
     text21 TEXT, 
     PRIMARY KEY (id) 
  ) 
engine=innodb 
row_format=dynamic; 

答案 1 :(得分:2)

看起来这种类型的问题有多种可能的解决方案。我发现此链接提供了良好的信息和一些有用的选项:http://www.mysqlperformanceblog.com/2011/04/07/innodb-row-size-limitation/

然而 ,如果您从一开始就知道要创建这样的结构,那么您应该重新考虑保存数据的方法。也许通过创建一个表可以更有效地实现您的目的,其中每个TEXT-N字段都是数据库中自己的行,相关的行由共享的'rowid'或类似的行表示......

答案 2 :(得分:2)

它通过将引擎更改为MyISAM解决了我的问题,因此想到共享相同的内容,

执行以下sql查询:

ALTER TABLE `table_name` ENGINE = MYISAM

PS:请通过以下链接: http://dev.mysql.com/doc/refman/5.0/en/storage-engines.html