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的扇出来计算高度如下:

最新文章

  1. Elixir - Hey, two great tastes that go great together!
  2. AppStore 内购验证的方法
  3. 6.9 Android 优缺点
  4. Python Import 详解
  5. operator new3种情况详解
  6. Educational Codeforces Round 7 D. Optimal Number Permutation 构造题
  7. UITableViewCell重用机制
  8. ifdebug
  9. (原创)LAMP教程6-使用SecureCRTPortable工具远程连接centos
  10. 给jdk写注释系列之jdk1.6容器(13)-总结篇之Java集合与数据结构
  11. ASP.NET-FineUI开发实践-6(三)
  12. 学习FFmpeg API – 解码视频
  13. Java多线程学习笔记--生产消费者模式
  14. 用xftp传送避免乱码问题
  15. 二维码开源库ZBar-吐槽篇
  16. C语言中file文件指针概念及其操作 (转载)
  17. 【LUOGU???】WD与地图 整体二分 线段树合并
  18. PostGIS计算矢量切片(一)--渲染数据
  19. Angular的项目结构
  20. ARMLCD屏调试2--ili9325驱动编写

热门文章

  1. EXCEL技能 | EXCEL中实现地图快照,截大图、加水印、保存PNG、TIF、HTML文件
  2. 从零搭建react hooks项目(github有源代码)
  3. mod4最优路径问题(转载)
  4. 使用.NET 6开发TodoList应用(10)——实现DELETE请求以及HTTP请求幂等性
  5. Git从远程仓库克隆
  6. Chapter 5 Interaction
  7. 【】Elasticsearch客户端API使用Demo
  8. Flask_路由(二)
  9. 【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)
  10. POJ 1664 放苹果 (递推思想)