2019独角兽企业重金招聘Python工程师标准>>>

今天开发在导入数据的时候报一个错误:

表结构大致如下:

发现导入的数据单行长度较长。

查看官方文档的解决办法为:

Solution:
1.divide your table into small ones. If one table contain more than 10 text colums, and the data contain is a little bit long. this error will be thrown out.
2.modify InnoDB to MyISAM.

但为什么会出现上面的解释?

通过查询发现为innodb的一个限制:

我们知道innodb的页块大小默认为16kb,表中数据是存放在B-tree node的页块中,但如果表中一行的数据长度超过了16k,这时候就会出现行溢出,溢出的行是存放在另外的地方,存放该溢出数据的页叫uncompresse blob page。

还要考虑的一点是,innodb采用聚簇索引的方式把数据存放起来,即B+树结构,因此每个页块中至少有两行数据,否则就失去了B+树的意义(每一个页中只有一条数据,整个树成为了一条双向链表),这样就得出了一行数据的最大长度就限制为了8k。

当插入的一行数据不能不能在一个数据页块中存放时,为了保证该页至少能存放两行数据,innodb将会自动部分数据溢出到另外页中,一部分数据将存放在数据页块中,其大小为该列的前768字节,同时接着还有偏移指向溢出页。

如上面所说大字段的前768字节会存放在数据页块中,那么如果有10个大字段(如varchar(1000),text,blob同varchar同样存储前768字节),同样会超过一行数据8k的限制10*768<8000,11*768>8000。如果插入的值超过8000字节,则会报错(BLOB或TEXT同理):

ERROR 1030 (HY000): Got error 139 from storage engine

测试如下:

插入10列数据(10*768<8000)可以插入:

插入11列数据(11*768>8000)报错:

Text数据类型测试:

Blob数据类型测试:

明白了是怎么一回事后,就可以解决出现问题了,减少varchar(1000)的字段数量,或者改存储引擎为myisam;还可以增加page_size的大小:如改为32k,64k。由于需求不好改动,数据库的页块大小改变需要改动源码,了解该表以查询为主,更新非常少,所以改为myisam存储引擎:

可以看到myisam存储引擎不受此限制。

从上面也可以看出,在mysql innodb存储引擎表收到页块大小,数据以B+树的方式组织数据,导致单行数据不能超过8k,从而影响了表中大字段数据类型varchar,text,blob个数限制,在16k页块大小下,最好不要超过10个,在表设计中需要注意这个限制。

在innodb plugin的版本中,mysql引入了新的文件格式:barracuda,梭鱼;改文件格式中拥有两种新的行记录:compressed,dynamic,这两钟格式对于BLOB数据完全采用行溢出方式,在数据页中只占用20字节用于指向溢出页。

转载于:https://my.oschina.net/yearnfar/blog/189510

innodb中大字段的限制相关推荐

  1. 用JAVA正则表达式轻松替换JSON中大字段

    用JAVA正则表达式轻松替换JSON中大字段 (一)背景 (二)正则表达式 (三)在JAVA代码中的实现 (四)合并正则表达式 (五)最终结果 (六)所感 (一)背景 在软件开发工作中我们经常用JSO ...

  2. java读取Oracle中大字段数据(CLOB)的方法

    2.Oracle数据库中有一个字段是CLOB类型,使用java 解析. 1.使用java解析clob类型内容 public String clobToString(Clob c) {StringBuf ...

  3. 浅谈 MySQL 子查询及其优化

    2019独角兽企业重金招聘Python工程师标准>>> 使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动 ...

  4. MySQL子查询的优缺点_浅谈mysql的子查询

    浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...

  5. 一文了解Innodb中的锁

    对于大部分的后端开发来说,数据库尤其是MySQL是一个离不开的知识点,那么今天就分享一下最近学习的数据库中的锁相关知识,并以此解释事务隔离性问题. 如下是整理的Mysql中锁的相关知识点 什么是锁 锁 ...

  6. Mysql字段类型选择

    1.字段类型选择 1.1尽量少的占据存储空间 int整形 年龄:tinyint(1个字节)0--255之间 乌龟年龄:smallint(2个字节)0--2的16次方 mediumint(3个字节)0- ...

  7. 创建数据库表及修改删除数据表字段

    创建数据库表   例: 目标:创建一个school数据库 创建学生表(列,字段)        使用SQL语句创建 要求:学号int.姓名varchar.密码varchar.生日datetime.家庭 ...

  8. mysql修改索引的sql_mysql-建表、添加字段、修改字段、添加索引SQL语句写法

    表的操作 1.建表 --如果USERS表存在则删除 DROP TABLE IF EXISTS USERS; CREATE TABLE USERS( id INT UNSIGNED NOT NULL A ...

  9. mysql表添加字段语句_mysql-建表、添加字段、修改字段、添加索引SQL语句写法

    表的操作 1.建表 1.建表 --如果USERS表存在则删除 DROP TABLE IF EXISTS USERS; CREATE TABLE USERS( id INT UNSIGNED NOT N ...

最新文章

  1. Mybatis 基本配置, 面向接口
  2. 用Electron开发企业网盘(二)--分片下载
  3. 不懂编程可以自学python吗-关于大学小白如何学习Python语言程序设计
  4. 怎样用“python”快速入门数据分析?
  5. 将Java应用部署到SAP云平台neo环境的两种方式
  6. 使用Scala实现Java项目的单词计数:串行及Actor版本
  7. Wordpress中显示页面当前位置
  8. ubuntu 16.04 终端命令太长,换行输入方法
  9. sql常用函数详解(一)——字符串截取
  10. 下个一个语音,计算机.,中国计算机产业的下一个亮点——汉语语音合成的实用化...
  11. Python软件安装教程
  12. Growth—电子书预览版
  13. java开发面试项目经验
  14. 联想机房升级Win10联想硬盘保护系统EDU8.0安装手记
  15. DTcmsV4.0分析学习——(2)系统框架
  16. linux ssd做raid1,linux 磁盘阵列 raid1搭建教程
  17. 企业微信获取临时素材,此处接口为语音接口
  18. 前端程序员兼职副业平台推荐
  19. 登录微软账户后远程桌面连接提示用户名错误
  20. 在 Linux 下用 CMAKE 编译安装 OpenCV 3.2.0

热门文章

  1. Nginx与php的整合
  2. js 操作json对象增删改
  3. React文档(六)state和生命周期
  4. 华为认证网络互连专家-HCIE-RS模拟试卷
  5. SQL server根据值搜表名和字段
  6. Ubuntu触摸板使用
  7. BCH再迎升级,真正比特币即将归来!
  8. 吴恩达机器学习:神经网络 | 反向传播算法
  9. [译] 在 Facebook 发一张登机牌,你就有可能被盗号了
  10. 大数据的“近因偏差”烦恼