MySql数据存储格式Compact及计算MySql的B+Tree高度
1、MySql的compact行记录格式
MySql从版本5.1以后默认使用的是compact行记录格式。可以通过执行以下命令查询到Row_format知悉InnoDB行记录格式类型。
show table status like '要查看的表名';
Compact行记录格式如下,注意:一个页中存放的行记录数据越多,其性能就越高。

- 变长字段列表:按照列的顺序逆序放置;若列的长度小于255字节,用1个字节表示;若列的长度大于255字节,用2个字节表示(MySql的库表中varchar字段最大长度限制为65535字节);
- null标志位:表示改行记录中是否有字段的值是null;
- 记录头信息:5个字节共40bit,分割成为多个标记,有两个关键的地方,一个是代表是否已被删除占1bit,另一个代表页中下一条记录的相对位置占16bit;
变长字段列表的理解:假设创建了一张表如下:
create table student(
id int(8) primary key,//自增
stuno char(8),
stuname varchar(20),
stusex char(1),
stuaddress varchar(360)
)
存储了一行数据('20210001','tom','M','中国深圳'),那么【变长字段列表】存储的就是0c 03,为什么是0c是因为“中国深圳”在utf8下面一个汉字占用3个字节,所以共占用12个字节换成16进制就是0c;stuname存储的英文字符,一个字符占用1个字节共占用3个字节所以是03。倒序排列即0c 03
如果存储了一行数据('20210001','tom','M','中国深圳中国深圳中国深圳中国深圳...中国深圳'),此处让中国深圳重复30次存入studaddress字段,那么【变长字段列表】存储的就是01 68 03 。因为30个中国深圳存在mysql中(utf8)共占用(4*3)*30=360个字节(转为16进制就是01 68);stuname存储的英文字符,一个字符占用1个字节共占用3个字节所以是03。倒序排列即01 68 03 。
所以说【变长字段列表】所占字节是可变的,当存了4个汉字时为0c 03占用了2个字节,当存了120个汉字时为01 68 03占用了3个字节。
另外,在compact行记录模式下,char和varchar的null值都不会占用存储空间。在mysql版本5之后,varchar(num)定义num代表字符,一个英文是一个字符,一个中文也是一个字符,但是在utf8下面,英文占用1个字节,中文占用3个字节。
2、计算MySql的B+Tree高度
理解以上compact格式后,就会知道怎么估算B+树索引的高度了。
假设有3000万条记录,每条记录5个字段(以上面的student表为例,估算地址用20个汉字表示,其他都是英文或数字且英文的占满长度),平均下来每个条记录大小估算如下4+8+20+1+20*3=63字节,这是存储的有效数据大小;【变长字段列表】存的内容是3c 14占用2个字节;空记录标记1个字节;记录头信息5个字节;事务ID用6个字节;隐藏列7个字节;即每条记录63+2+1+5+6+7=84字节。
每页大小是16KB,所以叶子节点大约需要3000万*84/16=15750万个,根据聚集索引知道,非叶子节点存储主键和指针(页的偏移量),假设指针大小是4字节,那么非叶子节点的最大扇出就是16KB/(4KB主键+4KB指针)=2048,如果按2048的扇出来计算高度如下:

MySql数据存储格式Compact及计算MySql的B+Tree高度的更多相关文章
- 完美转换MySQL的字符集 Mysql 数据的导入导出,Mysql 4.1导入到4.0
MySQL从4.1版本开始才提出字符集的概念,所以对于MySQL4.0及其以下的版本,他们的字符集都是Latin1的,所以有时候需要对mysql的字符集进行一下转换,MySQL版本的升级.降级,特别是 ...
- MySQL数据表修复, 如何修复MySQL数据库(MyISAM / InnoDB)
常用的Mysql数据库修复方法有下面3种: 1. mysql原生SQL命令: repair 即执行REPAIR TABLE SQL语句 语法:REPAIR TABLE tablename[,table ...
- mysql数据表最高速迁移,mysql的存储引擎为:myisam
本文链接:http://blog.csdn.net/u010670689/article/details/41346689 需求: 开发产品过程中,有个项目分支,数据库须要带数据拷贝,可是表的数据非常 ...
- Mysql数据的增删改查
一 介绍 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现 ...
- mysql 数据操作 目录
mysql 记录的增删改查 mysql 数据操作 单表查询 mysql 数据操作 多表查询
- mysql 数据操作 单表查询 目录
mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...
- SQL学习笔记四之MySQL数据操作
阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: DML =========== ...
- mysql数据增删查授权
一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...
- mysql 插入中文报错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value...
总结写在前面, 总结: 当Java通过jdbc链接mysql插入中文时,要保证程序可以正常执行,而且插入的中文不会乱码, mysql服务器端,对数据表(不是数据库)的编码设置,要保证是支持中文的,例如 ...
随机推荐
- Redis的各种实现(Jedis、Redisson、Lettuce)
1.1.Jedis 是Redis的Java实现的客户端.支持基本的数据类型如:String.Hash.List.Set.Sorted Set. 特点:使用阻塞的I/O,方法调用同步,程序流需要等到so ...
- 第二十八个知识点:什么是公钥密码学的IND-CCA安全定义?
第二十八个知识点:什么是公钥密码学的IND-CCA安全定义? 我们将在这篇博客中讨论公钥加密的IND-CCA安全. IND-CCA安全代表选择明文的不可伪造性.这样的安全方案的思想就是给定一个密文,攻 ...
- CS5268替代AG9321MCQ 替代AG9321方案 TYPEC转HDMI多功能拓展坞
台湾安格AG9321MCQ是一款TYPEC拓展坞产品方案,他集中了TYPEC 转HDMI VGA PD3.0快充 QC3.0数据传输 I2S接口的音频DAC输出以及可以各种读卡器功能. Caps ...
- Web前端浏览器默认样式重置(CSS Tools: Reset CSS)
/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) */ html, ...
- MySQL高级查询与编程笔记 • 【第5章 常见数据库对象】
全部章节 >>>> 本章目录 5.1 视图 5.1.1 视图的定义 5.1.2 视图的优点 5.1.3 视图的创建和使用 5.1.4 利用视图解决数据库的复杂应用 5.1. ...
- Kafka版本介绍Version2.4.0
1.说明 Kafka的版本从0.11.0.X到1.0.X, 再到2.0.X大版本, 其实没有经过几个版本, 只是版本号变化较大. 2.最新发布版本 截止本文章2020年2月22号发布时, Kafka ...
- .net core集成使用EasyNetQ来使用rabbitmq
之前有写到一篇介绍EasyNetQ的博文(C# .net 使用rabbitmq消息队列--EasyNetQ插件介绍),所以本文从.net core的角度去继承使用EasyNetQ,而用法类似于之前集成 ...
- Java 获取客户端浏览器中的语言设置
获取客户端的首选语言 javax.servlet.ServletRequest.getLocale() 根据Accept-Language请求头返回客户端的首选语言.如果客户端请求没有Accept-L ...
- MyBatis 二级缓存实现详解及使用注意事项
二级缓存介绍 在上文中提到的一级缓存中,其最大的共享范围就是一个SqlSession内部,如果多个SqlSession之间需要共享缓存,则需要使用到二级缓存.开启二级缓存后,会使用CachingExe ...
- MongoDB 安装及制作成windows服务
下载: 注:直接使用浏览器下载速度很慢,建议使用其他下载软件下载(比如:迅雷) 官网下载地址: https://fastdl.mongodb.org/win32/mongodb-win32-x86_ ...