文档章节

mysql的varchar大字段性能研究

中小宇
 中小宇
发布于 06/14 11:37
字数 956
阅读 4
收藏 0
点赞 0
评论 0

我们知道,innodb的一个页是16K(16*1024=16384字节),如果一条记录占的字节数大于16K,意味着一个页无法装下一条记录,这种情况下mysql是如何处理的呢?

  在回答这个问题之前我们先来做一个实验:

  我们创建了两张表,分别是T1和T2,T1和T2唯一的区别是在于b字段一个是varchar(8094),另一个是varchar(8095),然后我们有一个T1_test.sql文件,该文件包含有10W行“insert into T1 values(1,repeat('a',8094));”条sql语句,我们导入到表里花费了4分24秒。

  接着我们把T2_test.sql导入T2表中(T2.test.sql同样也包含了10W行类似的sql语句),花费了9分58秒!

  我们再来看这两个表文件的空间占用情况(本实例开启了innodb_file_per_talbe):

  可以看到T1表占用804M,T2表占用空间1.9G,空间及时间差异均超过2倍。

  为什么相差一个字符时间和空间相差会如此巨大呢?下面我们一起剖析下。

  在innodb存储引擎里,将一条记录中的某些数据存储在真正的数据页面之外称之为行溢出数据,一般认为blob、text这类的大对像列的存储会把数据存放在数据页面之外。但从上述我们的实验看出,除了blob、text这类大对像列以外,varchar类型似乎也会采用行溢出的方法来存储数据。

  Innodb存储引擎表是索引组织的,即B+树的结构,因此每个页中至少应该有两个行记录(否则失去了B+树的意义,变成链表了),如果页中只能存放下一条记录,那么InnoDB存储引擎会自动将行数据存放到溢出页中,以使每个页最少能存放两个行记录或以上。

  下面借助姜承尧先生写的py_innodb_page_info工具来证实T2发生了行溢出(点击这里可取得该工具源代码

  为了更清晰的分析原因,下面我们分别创建T1_1和T2_1表,其b字段也相差1字符,然后分别往这两个表插入一条记录,如下图所示:

  

  此时我们通过py_innodb_page_info工具分析T1_1表的情况

上图说明表T1_1只包含了一个B-tree,我们再看看T2_1的情况:

   我们看到T2_1表比T1_1表多了一页“Uncompressed BLOB Page”的页,这也充分说明了插到T2_1个的记录分了两页存储,其中一页是BLOB页。

  在上述的实验中,我们故意采取了两个字段,一个字段是4字节的int,另一个字段是varchar(8094),两者加起来即8098,也就说,当一个表的字段总大小数大于8098时,插入一条记录即会分裂成两页存储,故无论时间还是空间方面都大打折扣,有兴趣的读者可尝试下用一个或多个字段大小总和<=8098及>8098来做对比。

  大家在实验过程中要注意一点的是,当varchar小于255时,会额外用1个字节来记录该记录的实际长度,当varchar大于255时会用2个字节,因为时使用多个变长字段实验时,要注意其总大小要加上该空间。例如:“create table A1(a int, b varchar(2000), c varchar(3000), d varchar(3090));”那么此时的临界值就是4+2000+3000+3090=8090,因为相对于我们上述的实验,A1这个表多了两个大于255的varchar字段,因此需要额外的2+2=4字节来记录变长字段。

本文转载自:https://blog.csdn.net/mysqltop/article/details/21135239

共有 人打赏支持
中小宇
粉丝 6
博文 40
码字总数 20749
作品 0
福州
高级程序员
新工作总结之权限系统设计

项目概述: 复杂东西简单化。 细节上有很多不足之处,现在用的是mysql,之前用的一直是oracle,也都是看一些怎样提高查询效率,比如写存过,函数、递归查询、索引,避免全表扫描的之类的东西...

熊大熊二 ⋅ 2015/10/29 ⋅ 0

mysql的varchar大字段性能研究

我们知道,innodb的一个页是16K(16*1024=16384字节),如果一条记录占的字节数大于16K,意味着一个页无法装下一条记录,这种情况下mysql是如何处理的呢?   在回答这个问题之前我们先来做...

李_正 ⋅ 2016/04/15 ⋅ 0

infobright实战

之前的简介与架构分析之后,我做了一些实践,验证 infobright用于大量数据存储与查询的可行性。 我是从这里下载的infobright开源版本ICE3.1(据说刚出的ICE3.2查询速度更快)。用DEB包在ubu...

小编辑 ⋅ 2010/02/03 ⋅ 0

两难的境界:不定字段数目的数据库表设计和数据结构

两难的境界:不定字段数目的数据库表设计和数据结构 昨天项目组会议上讨论的关于不定字段数目的数据库表问题并没有结果,今天继续分析之后发现问题可能还更大。当时讨论的结果是可能采用四种...

长平狐 ⋅ 2012/10/23 ⋅ 0

OSC 第 102 期高手问答 —— MySQL 技术内幕

OSCHINA 本期高手问答( 12月8日- 12月14日)我们请来了 InnoSQL 的作者@姜承尧 来解答 MySQL 技术内幕 方面的问题。 姜承尧,@姜承尧 ,微信公众账号:InsideMySQL,80后生人,白羊男,常用英...

叶秀兰 ⋅ 2015/12/08 ⋅ 33

与技术谈一场永不分手的恋爱

找到一份合适的工作,就像在工作的八小时之内有了一个心仪的恋人。 老张我呢,原来在上学那会儿,不是特别爱学习,本人长得呢也特别帅(现在做了技术可惜了哈哈!)所以特招漂亮女孩的喜欢,...

superZS ⋅ 2017/07/21 ⋅ 0

Mysql配置参数innodb_buffer_pool_size的学习与整理

原文地址:Mysql配置参数innodbbufferpoolsize的学习与整理 这半个月来,一直在做一些关于服务器交易端性能的提升工作,主要是分析和讨论交易端性能的瓶颈,找出导致性能减慢的原因,拟定出合...

Realfighter ⋅ 2015/01/15 ⋅ 1

MySQL索引类型详解,让MySQL高效运行起来

索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。 在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytabl...

Junn ⋅ 2013/07/24 ⋅ 0

2017升的最快的几个数据库无责任点评

2017升的最快的几个数据库无责任点评 系统技术非业余研究2018-01-051 阅读 数据库MariaDB 原创文章,转载请注明: 转载自 系统技术非业余研究 本文链接地址: 2017升的最快的几个数据库无责任...

系统技术非业余研究 ⋅ 01/05 ⋅ 0

《安天365安全研究》知识星球安全圈子说明

我们致力于安全就研究和分享,分享前沿技术和实战技术,都是毫无保留的分享。打造一个真正的技术交流圈子,在这个圈子中可以快速获取想要的资料。为了杜绝一些伸手党,我们提出了收费,但也提...

simeon2005 ⋅ 2017/10/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

windows profesional 2017 build problem

.net framework .... https://stackoverflow.com/questions/43330915/could-not-load-file-or-assembly-microsoft-build-frameworkvs-2017...

机油战士 ⋅ 40分钟前 ⋅ 0

python3中报错的解决方法(长期更新)

1、ImportError: No module named ‘DjangoUeditor’ 出错原因:安装DjangoUeditor库适用于python2,需要下载适用python3的 下载地址:https://github.com/twz915/DjangoUeditor3 2、python3......

xiaoge2016 ⋅ 44分钟前 ⋅ 0

数据结构与算法之双向链表

一、双向链表 1.双向链表的结点结构 typedef struct DualNode{ ElemType data; struct DualNode *prior; // 前驱结点 struct DualNode *next; // 后继结点}DualNode, *DuL...

aibinxiao ⋅ 今天 ⋅ 0

五大最核心的大数据技术

大数据技术有5个核心部分,数据采集、数据存储、数据清洗、数据挖掘、数据可视化。关于这5个部分,有哪些核心技术?这些技术有哪些潜在价值?看完今天的文章就知道了。 大数据学习群:7165810...

董黎明 ⋅ 今天 ⋅ 0

PhpStorm 头部注释、类注释和函数注释的设置

首先,PhpStorm中文件、类、函数等注释的设置在:setting-》Editor-》FIle and Code Template-》Includes下设置即可,其中方法的默认是这样的: /**${PARAM_DOC}#if (${TYPE_HINT} != "v...

nsns ⋅ 今天 ⋅ 0

spring.net AOP

http://www.springframework.net/doc-latest/reference/html/aop-quickstart.html https://www.cnblogs.com/wujy/archive/2013/04/06/3003120.html...

whoisliang ⋅ 今天 ⋅ 0

【HAVENT原创】创建 Dockerfile 生成新的镜像,并发布到 DockerHub

注意:Win7 与 Win10 的版本存在差异,Win7 版本使用 Docker Quickstart Terminal 进入控制台,Win10下面直接用管理员权限打开控制台或者 PowerShell 即可;另外 Win7 下面只能访问 C盘,/ap...

HAVENT ⋅ 今天 ⋅ 0

pom.xml出现web.xml is missing ...解决方案

提示信息应该能看懂。也就是缺少了web.xml文件,<failOnMissingWebXml>被设置成true了。 搜索了一下,Stack Overflow上的答案解决了问题,分享一下。 目前被顶次数最多的回答原文如下: This...

源哥L ⋅ 今天 ⋅ 0

js时间戳与日期格式之间相互转换

1. 将时间戳转换成日期格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 /** 1. 下面是获取时间日期的方法,需要什么样的格式自己...

Jack088 ⋅ 今天 ⋅ 0

web添加log4j

添加xml配置log4j.properties # Global logging configuration---root日志设置#log4j.rootLogger=info,dailyRollingFile,stdoutlog4j.rootLogger=debug,stdout,dailyRollingFile---......

黄柳淞 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部