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的扇出来计算高度如下:
最新文章
- Elixir - Hey, two great tastes that go great together!
- AppStore 内购验证的方法
- 6.9	 Android 优缺点
- Python Import 详解
- operator new3种情况详解
- Educational Codeforces Round 7 D. Optimal Number Permutation 构造题
- UITableViewCell重用机制
- ifdebug
- (原创)LAMP教程6-使用SecureCRTPortable工具远程连接centos
- 给jdk写注释系列之jdk1.6容器(13)-总结篇之Java集合与数据结构
- ASP.NET-FineUI开发实践-6(三)
- 学习FFmpeg API – 解码视频
- Java多线程学习笔记--生产消费者模式
- 用xftp传送避免乱码问题
- 二维码开源库ZBar-吐槽篇
- C语言中file文件指针概念及其操作 (转载)
- 【LUOGU???】WD与地图 整体二分 线段树合并
- PostGIS计算矢量切片(一)--渲染数据
- Angular的项目结构
- ARMLCD屏调试2--ili9325驱动编写
热门文章
- EXCEL技能 | EXCEL中实现地图快照,截大图、加水印、保存PNG、TIF、HTML文件
- 从零搭建react hooks项目(github有源代码)
- mod4最优路径问题(转载)
- 使用.NET 6开发TodoList应用(10)——实现DELETE请求以及HTTP请求幂等性
- Git从远程仓库克隆
- Chapter 5 Interaction
- 【】Elasticsearch客户端API使用Demo
- Flask_路由(二)
- 【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)
- POJ 1664 放苹果 (递推思想)