1.为什么创建一个InnoDB表只分配了96K而不是1M?

2.解析第2行记录格式?(用下面的表定义和数据做测试)

mysql> create table gyj_t3 (id int,name1 varchar(),name2 varchar(),name3 varchar(),name4 varchar(),name5 varchar());
Query OK, rows affected (0.11 sec) mysql> insert into gyj_t3 (id,name1,name2,name3,name4) values(,'A','BB','CCC','DDDD');
Query OK, row affected (0.03 sec) mysql> insert into gyj_t3 values(,'aaaaaaaaaa','bbbbbbbbbb','ccccc','dddddd','e');
Query OK, row affected (0.06 sec) mysql> commit;
Query OK, rows affected (0.00 sec) mysql> insert into gyj_t3 values(,'aaaaaaaaaa','bbbbbbbbbb',null,'dddddd','e');
Query OK, row affected (0.05 sec) mysql> commit;
Query OK, rows affected (0.00 sec) mysql> SELECT * FROM gyj_t3;
+------+------------+------------+-------+--------+-------+
| id | name1 | name2 | name3 | name4 | name5 |
+------+------------+------------+-------+--------+-------+
| | A | BB | CCC | DDDD | NULL |
| | aaaaaaaaaa | bbbbbbbbbb | ccccc | | NULL |
| | aaaaaaaaaa | bbbbbbbbbb | ccccc | dddddd | e |
| | aaaaaaaaaa | bbbbbbbbbb | NULL | dddddd | e |
+------+------------+------------+-------+--------+-------+

数据

3.详细描述commit命令发出后,binlog日志从内存写到磁盘的过程序?


1.为什么创建一个InnoDB表只分配了96K而不是1M?

  • innodb在给数据分配存储空间时,首先给32个的不连续的page

一个extent区是1M

  • 如果32个page不够用,再分配一段连续的64个page,也就是16384*64=1M,此后每次分配空间都是1M的整数倍
  • 目的:
    • 节省空间
    • 小的undo 32个 page就够了

问题:linux下查看一个ibd文件,大小是96K,也就是6个页,那么32个页不是一次性给完而是用多少给多少?

-rw-rw----.  mysql mysql .6K Feb  : t3.frm
-rw-rw----. mysql mysql 96K Feb : t3.ibd

32个page是524288字节,差不多是512KB,插入数据使文件达到500多kb时,下一次增长为1M的整数倍


2.解析第2行记录格式?(用下面的表定义和数据做测试)

+------+------------+------------+-------+--------+-------+
| id | name1 | name2 | name3 | name4 | name5 |
+------+------------+------------+-------+--------+-------+
| | A | BB | CCC | DDDD | NULL |
| | aaaaaaaaaa | bbbbbbbbbb | ccccc | | NULL |
| | aaaaaaaaaa | bbbbbbbbbb | ccccc | dddddd | e |
| | aaaaaaaaaa | bbbbbbbbbb | NULL | dddddd | e |
+------+------------+------------+-------+--------+-------+ create table t3 (id int,name1 varchar(),name2 varchar(),name3 varchar(),name4 varchar(),name5 varchar());
insert into t3 (id,name1,name2,name3,name4) values(,'A','BB','CCC','DDDD');
insert into t3 (id,name1,name2,name3,name4) values(,'aaaaaaaaaa','bbbbbbbbbb','ccccc','');
insert into t3 (id,name1,name2,name3,name4,name5) values(,'aaaaaaaaaa','bbbbbbbbbb','ccccc','dddddd','e');
insert into t3 (id,name1,name2,name4,name5) values(,'aaaaaaaaaa','bbbbbbbbbb','dddddd','e');

  • NULL不占空间
  • ''也不占空间

问题:NULL如何标志哪些列是NULL的?

《MySQL技术内幕InnoDB存储引擎》106页及网上大部分都是提了一下,参考http://blog.csdn.net/linux_ever/article/details/64124868

第三行有NULL值,因为NULL标志位不再是00而是06,转换成二进制00000110,为1的值表示第2列和第3列的数据为NULL。其后存储列数据的部分,没有存储NULL列,而只存储了第1列和第4列的非NULL的值

*************************** 3. row ***************************
t1: d
t2: NULL
t3: NULL
t4: fff
3 rows in set (0.00 sec)

这里的第2和第3列为NULL,NULL标志位为06,二进制是00000110,是怎么算出来2、3列的?

本次作业的第1、2行数据第5列为NULL,标志位是20,二进制是00100000
第4行数据第4列为NULL,标志位是08,二进制是00001000

int长度是4字节,其他可变长name长度是10字节,用多少长多少
https://www.cnblogs.com/wade-luffy/p/6289183.html
http://blog.csdn.net/beiigang/article/details/42175995

ibd文件格式如下
内容 16进制地址
File Space Header 0x0008
Insert Buffer Bitmap 0x0005
File Segment Inode 0x0003
Used Page 0x45BF
…… 第N-4个块
Used Page 第N-3个块
Free Page 第N-2个块
…… 第N-2个块
Free Page 第N-2个块

https://dev.mysql.com/doc/internals/en/innodb-page-overview.html
https://www.cnblogs.com/crossapply/p/5455620.html

行记录格式
  • compressed 压缩页,默认16K,可以压缩成8K、4: alter table tabname row_format=compressed,key_block_size=8;
  • Dynamic 存储LOB/TEXT字段,由20字节+偏移量组成,本身不存储数据,偏移量指向数据
  • Compact 默认行记录格式,超出行记录长度时,由前缀768字节+偏移量组成,本身存储部分数据,偏移量指向数据
  • Redundant 废弃
获取ibd十六进制文本
hexdump -C -v t3.ibd > /tmp/t3.ibd.txt

[root@docker01 tmp]# cat t3.ibd.txt |head -n
0a cf |$...............|
1a e3 |......%.........|
[root@docker01 tmp]# cat t3.ibd.txt |head -n | tail -n |head -n
5f |._Ga............|
1a |.......'........|
[root@docker01 tmp]# cat t3.ibd.txt |head -n | tail -n |head -n
c2 6e |.%ng............|
1a e3 |......%.........|
[root@docker01 tmp]# cat t3.ibd.txt |head -n | tail -n |head -n
0000c000 1b 2c ff ff ff ff ff ff ff ff |H..,............|
0000c010 1a 3e 2e bf |......>.E.......|
截取第4页 0000c000 1b 2c ff ff ff ff ff ff ff ff |H..,............|
0000c010 1a 3e 2e bf |......>.E.......|
0000c020 0d 5b |.........[......|
0000c030 |.)..............|
0000c040 1b 0d |................|
0000c050 f2 0d |...............|
0000c060 1f 6e 6d 6d 0b |...infimum......|
0000c070 6d 6d |supremum.... ...|
0000c080 2b 0b b7 |.+...........R..|
0000c090 6b |..k......ABBCCCD|
0000c0a0 0a 0a 3b |DDD.... ....;...|
0000c0b0 0b b7 6b 1e |........R....k..|
0000c0c0 |....aaaaaaaaaabb|
0000c0d0 |bbbbbbbbccccc...|
0000c0e0 0a 0a |..... .A........|
0000c0f0 0b b7 6b 2c |...R....k.,....a|
0000c100 |aaaaaaaaabbbbbbb|
0000c110 |bbbcccccdddddde.|
0000c120 0a 0a ff |......(.G.......|
0000c130 0b b7 6b 3a |....R....k.:....|
0000c140 |aaaaaaaaaabbbbbb|
0000c150 |bbbbdddddde.....|
.....
0000fff0 8b 8a 1a 3e 2e |.....p.c..&...>.|

hexdump

3.详细描述commit命令发出后,binlog日志从内存写到磁盘的过程序?

  • 先做write操作

    • 日志会被write到每个线程对应的文件句柄的缓存中,也就是标准的IO缓存中
    • 每个线程会缓存到自己的IO缓存中,每个线程产生的日志其他线程是不可见的

此时发生宕机,日志丢失,脏块丢失

  • 再做flush操作

    • 将私有缓存中的日志写到公共可见的操作系统文件缓存,此时不同线程都可以看到其他线程的日志内容

此时宕机,依然丢失数据

  • 最后做sync持久化

    • 将日志从内存中写到硬盘

sync_binlog 1 多少次事务一起写binlog
innodb_flush_log_at_trx_commit 1 写redolog


索引:

  • 主键索引
  • 非空唯一索引
  • 都没有的话走6字节的rowid,但是不能作为where过滤条件

index organized table索引组织表:数据就在叶子节点上,检索数据不需要回行

回行,先找到索引所在位置,根据索引再一次找到数据 二级索引、辅助索引,叶子节点只存储索引信息,叶子上带着的信息指向数据所在的主键索引的位置

innodb逻辑存储结构: tablespace - segement - extent - page - row

表空间是否独立 innodb_file_per_table,默认为ON
如果是独立表空间,一张表一个表空间
如果是off,就全部放在ibdata1里面了
查看表ID ,0 代表的是系统表空间 select * from innodb_sys_tables

  • tablespace指的是共享表空间ibdata1,存储的是undo、插入缓冲索引页、系统事务、double write buffer,因为写undo原因,大小随时变化

  • ib_logfile,每个表自己的空间:数据(跟主键索引一起存放)、辅助索引、插入缓存bitmap

  • 插入缓冲

    • 主键索引和数据放在一起,其他索引放在索引页
    • 往辅助索引页写东西时,每个被写入的页先放在buffer存着
    • 一旦有需要被写入的索引页读入了内存,这是把buffer里存着的东西一起写进去
  • segement 段

    • 段等于表,段是数据的物理存储形式,表是数据的逻辑定义
    • 数据段,聚簇索引,数据段在B-tree的叶子结点
    • 索引段,非叶子结点就是索引
  • extent 区

    • 一个extent是1M,是分配空间的最小单位
    • 1M由64个连续的page组成,一个page是16K
    • innodb为保证extent连续,一次申请多个
    • 一个extent由多个page组成
  • page 页,类似存储块大小

    • 最小的IO单位
    • page默认大小是16K innodb_page_size = 16384
  • ROW 行
  • 事务ID、回滚指针、数据、索引

innodb文件结构
表的组成:

  • tabname.ibd 表数据
  • File Space Header
  • tabname.frm 表结构

hexdump -C -v tabname.ibd 一个page 16K,16进制一行有16个字节,那么一个page就有1024行 查看第一个块
hexdump -C -v tabname.ibd |head -n 1024 | head -n 2
2块
hexdump -C -v tabname.ibd |head -n 2048 |tail -n 1024
3块
hexdump -C -v tabname.ibd |head -n 3072 |tail -n 1024

mysql小白系列_04 datablock的更多相关文章

  1. mysql小白系列_04 binlog(未完)

    mysql打开.查看.清理binlog 1.开启日志 log_bin=/var/lib/mysql/mysql-bin mysql> show variables like '%log_bin% ...

  2. mysql小白系列_14 线上故障分析与排错

    1.重现故障5---线上执行update报错,并处理.(表结构和UPDATE语句自己构造,请给出详细步骤) 1)update故障出现ERROR 1206 (HY000): The total numb ...

  3. mysql小白系列_13 Online DDL

    Online DDL: 一.FIC之前的添加删除二级索引: 1.首先创建临时表,定义目标新表的选项和索引 2.逐行拷贝数据到临时表 3.插入行时更新索引信息 4.数据全部被拷贝到新表后,删除旧表,re ...

  4. mysql小白系列_12 sysbench

    压测 1.查看机器负载load top - load average 1m 5m 15m cat /proc/loadavg 与CPU个数有关,1个load表示1个CPUcat /proc/cpuin ...

  5. mysql小白系列_11 MHA

    一.MHA是什么?能干什么的 (1)以Perl语言写的一套Mysql故障切换方案,一个脚本管理工具 (2)保障数据库的高可用性 (3)修复多个slave之间的差异日志,最终使所有的slave保持数据一 ...

  6. mysql小白系列_10 mysql主从复制原理

    1.如何解决主从复制延迟的问题? (1)主从复制原理 http://www.cnblogs.com/jenvid/p/8410922.html 1.salve执行slave start,salve服务 ...

  7. mysql小白系列_09 mysql性能优化关键点

    一 服务器参数调优,有哪些关键点? 1. 应用访问优化 优化方法 性能提升效果 优化成本 说明 减少数据访问能不访问就不访问-减少磁盘IO 1~1000 低 缓存服务器缓存mysql数据,Redis. ...

  8. mysql小白系列_08 zabbix添加自定义监控项items和触发器

    监控mysql存活 1.配置agent自定义参数 vi /usr/local/zabbix/etc/zabbix_agentd.conf Include=/usr/local/zabbix/etc/z ...

  9. mysql小白系列_08 zabbix3.2.6概念及部署

    一 zabbix功能简介 1.zabbix三大监控组件 zabbix server web gui database zabbix_server zabbix proxy agent client 2 ...

随机推荐

  1. GDI+ 绘制砂岩含量图版

    图版是在工作中经常会使用到的工具,它能够大大提高我们日常工作效率.地质图版在地质工作中具有举足轻重的作用,不仅可以轻松判断岩性,也可以依据经验图版直接得到结果,十分方便. 本程序目的绘制出一个地质常用 ...

  2. Docker安装Alibaba Nacos教程(单机)

    SpringCloudAlibaba实战教程系列 阿里巴巴Nacos官方文档 docker:官网 docker:镜像官网:镜像官网可以所有应用,选择安装环境:会给出安装命令,例如:docker pul ...

  3. mac OS 安装 nvm

    nvm官网 https://github.com/creationix/nvm nvm,node,npm之间的区别 nvm:nodejs 版本管理工具 一个 nvm 可以管理很多 node 版本和 n ...

  4. puppet报告系统Dashboard部署及配置详解

    Puppet Dasshboard是由支持Puppet开发的公司Puppetlabs创建的,是Ruby on Rails程序.可以作为一个ENC(外部节点分类器)以及一个报告工具,并且正在逐渐成为一个 ...

  5. vue 遮罩层阻止默认滚动事件

    vue中提供 @touchmove.prevent 方法可以完美解决这个问题. <div class="child" @touchmove.prevent ></ ...

  6. 2019 ICPC 银川网络赛 H. Fight Against Monsters

    It is my great honour to introduce myself to you here. My name is Aloysius Benjy Cobweb Dartagnan Eg ...

  7. 日常开发中常用的linux命令

    本文并不将linux的常用命令全部罗列出来,列出一下常用.容易忘记的命令. 更详细的说明见:https://www.cnblogs.com/xuxinstyle/p/9609551.html 文件相关 ...

  8. USB设备驱动模型

    嵌入式设备驱动的编写,基本上都要按照一定的驱动模型编写.不这么做的话,一旦设备发生了更新和改变,大部分的驱动代码都要推倒重来,代码的重用率低,不具备移植性.所以在新版linux2.6.22以后的内核版 ...

  9. 04 全局局部配置 wxml数据绑定 事件 冒泡

    一. 配置介绍 一个小程序应用程序会包括最基本的两种配置文件.一种是全局的 app.json 和 页面自己的 page.json(index.json /test.json等) 注意:配置文件中不能出 ...

  10. 【网络基础】ARP地址解析协议

    ARP(Address Rssolution Protocol) 地址解析协议 用于将IP地址解析为MAC地址. MAC地址是设备的物理地址,是被分配给每一个网络接口卡的全球唯一序号. 全球唯一:理论 ...