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服务器端,对数据表(不是数据库)的编码设置,要保证是支持中文的,例如 ...
随机推荐
- 第二十一个知识点:CRT算法如何提高RSA的性能?
第二十一个知识点:CRT算法如何提高RSA的性能? 中国剩余定理(The Chinese Remainder Theorem,CRT)表明,如果我们有两个等式\(x = a \mod N\) 和\(x ...
- [Guide]Google C++ Style Guide
0.0 扉页 项目主页 Google Style Guide Google 开源项目风格指南 -中文版 0.1 译者前言 Google 经常会发布一些开源项目, 意味着会接受来自其他代码贡献者的代码. ...
- EDP转LVDS屏转接线或者转接板方案|CS5211替代PS8625|PS8622|CS5211
PS8625 (DP至LVDS)是一款DisplayPort到LVDS转换器方案芯片, 可实现双通道DP输入,双链路LVDS输出.同时PS8625是一个显示端口到LVDS转换器设计的PC机,利用GPU ...
- linux(CentOS7) 之 jdk1.8 下载及安装
下载 一.百度搜索oracle,进入官网(或直接进入官网https://www.oracle.com) 二.选择 products 下的 java 三.选择Download Java 四.往下翻找到J ...
- GORM学习指南
orm是一个使用Go语言编写的ORM框架.它文档齐全,对开发者友好,支持主流数据库. 一.初识Gorm Github GORM 中文官方网站内含十分齐全的中文文档,有了它你甚至不需要再继续向下阅读本文 ...
- vue2.0多页面开发
我们平常用vue开发的时候总觉得vue好像就是专门为了单页面应用而诞生的,其实不是.因为vue在工程化开发的时候很依赖webpack,而webpack是将所有的资源整合到一块,弄成一个单页面.但是vu ...
- 服务性能监控系列之Metrics
Metrics是一个提供服务性能检测工具的Java类库,它提供了功能强大的性能指标工具库用于度量生产环境中的各关键组件性能. 度量类型 Metrics提供了以下几种基本的度量类型: Gauge:用于提 ...
- 基于springboot的定时任务实现(非分布式)
1. 核心注解 在springboot项目中我们可以很方便地使用spring自己的注解@Scheduled和@EnableScheduling配合来实现便捷开发定时任务. @EnableSchedul ...
- 51 Nod 1134 最长递增子序列 (动态规划基础)
原题链接:1134 最长递增子序列 题目分析:长度为 的数列 有多达 个子序列,但我们应用动态规划法仍可以很高效地求出最长递增子序列().这里介绍两种方法. 先考虑用下列变量设计动态规划的算法. ...
- ffmpeg+nginx截取屏幕实时画面并进行rtmp推流在前端播放
准备环境和文件 1.下载ffmpeg的包[https://foxbaby.lanzoui.com/iYjPmup51cd] 地址:https://ffmpeg.org/download.html#bu ...