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高度的更多相关文章

  1. 完美转换MySQL的字符集 Mysql 数据的导入导出,Mysql 4.1导入到4.0

    MySQL从4.1版本开始才提出字符集的概念,所以对于MySQL4.0及其以下的版本,他们的字符集都是Latin1的,所以有时候需要对mysql的字符集进行一下转换,MySQL版本的升级.降级,特别是 ...

  2. MySQL数据表修复, 如何修复MySQL数据库(MyISAM / InnoDB)

    常用的Mysql数据库修复方法有下面3种: 1. mysql原生SQL命令: repair 即执行REPAIR TABLE SQL语句 语法:REPAIR TABLE tablename[,table ...

  3. mysql数据表最高速迁移,mysql的存储引擎为:myisam

    本文链接:http://blog.csdn.net/u010670689/article/details/41346689 需求: 开发产品过程中,有个项目分支,数据库须要带数据拷贝,可是表的数据非常 ...

  4. Mysql数据的增删改查

    一 介绍 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现 ...

  5. mysql 数据操作 目录

    mysql 记录的增删改查 mysql 数据操作 单表查询 mysql 数据操作 多表查询

  6. mysql 数据操作 单表查询 目录

    mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...

  7. SQL学习笔记四之MySQL数据操作

    阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: DML =========== ...

  8. mysql数据增删查授权

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  9. mysql 插入中文报错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value...

    总结写在前面, 总结: 当Java通过jdbc链接mysql插入中文时,要保证程序可以正常执行,而且插入的中文不会乱码, mysql服务器端,对数据表(不是数据库)的编码设置,要保证是支持中文的,例如 ...

随机推荐

  1. Pikachu漏洞练习-SQL-inject(三)

  2. iNeuOS工业互联网操作系统,矿山动态产量计量系统和铁路车辆识别系统应用场景案例

    目       录 1.      概述... 2 2.      平台演示... 2 3.      矿山动态产量计量系统... 2 4.      铁路车辆识别系统... 4 1.   概述 iN ...

  3. Codeforces Gym-100985C: MaratonIME plays Nim(交互题&博弈)

    C. MaratonIME plays Nim time limit per test : 2.0 smemory limit per test : 64 MBinputstandard inputo ...

  4. Spurious Local Minima are Common in Two-Layer ReLU Neural Networks

    目录 引 主要内容 定理1 推论1 引理1 引理2 Safran I, Shamir O. Spurious Local Minima are Common in Two-Layer ReLU Neu ...

  5. CS5211替代CH7511B|设计DP转LVDS转接板|替代CH7511B

    CH7511B是一款DP转lvds屏转换芯片CH7511B是一款eDP转LVDS转换芯片.CH7511B将嵌入式DisplayPort信号转换为LVDS(低压差分信号).通过CH7511B的高级解码/ ...

  6. c++—通讯录管理系统

    一.运用所学的结构体.地址指针等基础知识,完成通讯录管理系统 二.系统主要有以下6个功能: 1.添加联系人2.显示联系人 3.删除联系人 4.查找联系人5.修改联系人 6.清空联系人 1 #inclu ...

  7. pod运行到指定node节点

    利用labels 1.一般来说都每个节点有自己特有的labels  比如 2.利用nodeSelector nodeSelector: kubernetes.io/hostname: master3 ...

  8. MongoDB开发最佳实践

    MongoDB开发最佳实践 连接到MongoDB · 关于驱动程序:总是选择与所用之MongoDB相兼容的驱动程序.这可以很容易地从驱动兼容对照表中查到: · 如果使用第三方框架(如Spring Da ...

  9. Google面试评分卡

    Google对工程面试之前,会让面试人员填一张评分卡,以加强面试官对你的理解,大致内容如下: 0 - 对于相关技术领域还不熟悉. 1 - 可以读懂这个领域的基础知识. 2 - 可以实现一些小的改动,清 ...

  10. python requests发起请求,报“Max retries exceeded with url”

    需要高频率重复调用一个接口,偶尔会出现"Max retries exceeded with url" 在使用requests多次访问同一个ip时,尤其是在高频率访问下,http连接 ...