【问题标题】:Increasing MySql Innodb Row length to avoid Error 139增加 MySql Innodb 行长度以避免错误 139
【发布时间】:2011-01-14 07:18:37
【问题描述】:

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

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

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

非常感谢您对此的任何帮助。

谢谢, 阿肖克。

【问题讨论】:

  • 你能展示你的 CREATE TABLE 语句吗?
  • 创建查询为 , 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,主键(ID))引擎= InnoDB;我还尝试使用 ROW_FORMAT 将其设置为 DYNAMIC。但这也无济于事..表格状态仍显示表格为紧凑格式。

标签: mysql innodb mysql-error-1030


【解决方案1】:

InnoDB 要求一页 (16k) 必须包含至少两条记录。如果减去开销,每条记录的限制将接近 8k。

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

对于紧凑型COMPACT,规则如下。如果记录长于~8k,则页面存储 BLOB 字段的前 768 个字节。该字段的其余部分存储在外部页面链中。使用 15 个 BLOB 字段,每个字段 500 字节 + 其他开销,您超过了每条记录约 8k 的限制。

DYNAMIC 格式已针对 BLOB 进行了优化。限制是相同的,每条记录约 8k。但是,如果记录超出限制,则仅存储对外部页面的引用(它是 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; 

【讨论】:

    【解决方案2】:

    对于此类问题,似乎有多种可能的解决方案。我发现这个链接提供了很好的信息和一些很好的切实可行的选择:http://www.mysqlperformanceblog.com/2011/04/07/innodb-row-size-limitation/

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

    【讨论】:

      【解决方案3】:

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

      执行下面的sql查询:

      ALTER TABLE `table_name` ENGINE = MYISAM
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 2014-01-22
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多