innodb中大字段的限制
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中大字段的限制相关推荐
- 用JAVA正则表达式轻松替换JSON中大字段
用JAVA正则表达式轻松替换JSON中大字段 (一)背景 (二)正则表达式 (三)在JAVA代码中的实现 (四)合并正则表达式 (五)最终结果 (六)所感 (一)背景 在软件开发工作中我们经常用JSO ...
- java读取Oracle中大字段数据(CLOB)的方法
2.Oracle数据库中有一个字段是CLOB类型,使用java 解析. 1.使用java解析clob类型内容 public String clobToString(Clob c) {StringBuf ...
- 浅谈 MySQL 子查询及其优化
2019独角兽企业重金招聘Python工程师标准>>> 使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动 ...
- MySQL子查询的优缺点_浅谈mysql的子查询
浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...
- 一文了解Innodb中的锁
对于大部分的后端开发来说,数据库尤其是MySQL是一个离不开的知识点,那么今天就分享一下最近学习的数据库中的锁相关知识,并以此解释事务隔离性问题. 如下是整理的Mysql中锁的相关知识点 什么是锁 锁 ...
- Mysql字段类型选择
1.字段类型选择 1.1尽量少的占据存储空间 int整形 年龄:tinyint(1个字节)0--255之间 乌龟年龄:smallint(2个字节)0--2的16次方 mediumint(3个字节)0- ...
- 创建数据库表及修改删除数据表字段
创建数据库表 例: 目标:创建一个school数据库 创建学生表(列,字段) 使用SQL语句创建 要求:学号int.姓名varchar.密码varchar.生日datetime.家庭 ...
- mysql修改索引的sql_mysql-建表、添加字段、修改字段、添加索引SQL语句写法
表的操作 1.建表 --如果USERS表存在则删除 DROP TABLE IF EXISTS USERS; CREATE TABLE USERS( id INT UNSIGNED NOT NULL A ...
- mysql表添加字段语句_mysql-建表、添加字段、修改字段、添加索引SQL语句写法
表的操作 1.建表 1.建表 --如果USERS表存在则删除 DROP TABLE IF EXISTS USERS; CREATE TABLE USERS( id INT UNSIGNED NOT N ...
最新文章
- Mybatis 基本配置, 面向接口
- 用Electron开发企业网盘(二)--分片下载
- 不懂编程可以自学python吗-关于大学小白如何学习Python语言程序设计
- 怎样用“python”快速入门数据分析?
- 将Java应用部署到SAP云平台neo环境的两种方式
- 使用Scala实现Java项目的单词计数:串行及Actor版本
- Wordpress中显示页面当前位置
- ubuntu 16.04 终端命令太长,换行输入方法
- sql常用函数详解(一)——字符串截取
- 下个一个语音,计算机.,中国计算机产业的下一个亮点——汉语语音合成的实用化...
- Python软件安装教程
- Growth—电子书预览版
- java开发面试项目经验
- 联想机房升级Win10联想硬盘保护系统EDU8.0安装手记
- DTcmsV4.0分析学习——(2)系统框架
- linux ssd做raid1,linux 磁盘阵列 raid1搭建教程
- 企业微信获取临时素材,此处接口为语音接口
- 前端程序员兼职副业平台推荐
- 登录微软账户后远程桌面连接提示用户名错误
- 在 Linux 下用 CMAKE 编译安装 OpenCV 3.2.0