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. 曹工力荐:调试 jdk 中 rt.jar 包部分的源码(可自由增加注释,修改代码并debug)

    背景 大家知道,jdk安装的目录下,一般会有个src.zip包,这个包基本对应了rt.jar这个包.rt.jar这个包里面,就放了jdk中,jdk采用java实现的那部分类库代码,比如java.lan ...

  2. 打造更好用的 EF 自动审计

    打造更好用的 EF 自动审计 Intro 上次基于 EF Core 实现了一个自动审计的功能,详细可以参考 https://www.cnblogs.com/weihanli/p/auto-audit- ...

  3. 也许你对 Fetch 了解得不是那么多(下)

    上文链接:也许你对 Fetch 了解得不是那么多(上) 编者按:除创宇前端与作者博客外,本文还在语雀发布. 编者还要按:作者也在掘金哦,欢迎关注:@GoDotDotDot Fetch 与 XHR 比较 ...

  4. Apache Storm 官方文档 —— Storm 与 Kestrel

    本文说明了如何使用 Storm 从 Kestrel 集群中消费数据. 前言 Storm 本教程中使用了 storm-kestrel 项目和 storm-starter 项目中的例子.建议读者将这几个项 ...

  5. 解决w3wp.exe占用CPU和内存问题

    在WINDOWS2003+IIS6下,经常出现w3wp的内存占用不能及时释放,从而导致服务器响应速度很慢.可以做以下配置进行改善:1.在IIS中对每个网站进行单独的应用程序池配置.即互相之间不影响.2 ...

  6. Aurora: 来自 Amazon 的高性能的企业级关系数据库,兼容 MySQL

    近日,在美国召开的AWS re:Invent云计算大会上,Amazon高级副总裁安迪·杰西发布了企业级关系数据库Aurora.Aurora是一个面向Amazon RDS(关系数据库服务).兼容MySQ ...

  7. Muduo网络库实战(二):实现服务器与客户端的连接

    1. 方案的确定 1)基本需求 用户1000+, IO压力不大: 多个客户端打开网站,输入查询字符串strclient,发送给服务器=>服务器接收客户端发过来的数据并处理,将结果返回给客户端: ...

  8. CentOS启用iptables防火墙

    centos 7默认的防火墙使用firewall,系统服务管理方式也变更了,可以通过systemctl命令控制. 可以参考这个链接 但是习惯用iptables,可以按下面的操作改下 1.关闭firew ...

  9. OSG程序设计之Hello World 2.0

    现在为Hello World添加一些键盘响应事件. //需要多添加两个库:osgGAd.lib.osgd.lib 代码如下: #include <osgDB/ReadFile> #incl ...

  10. P1790 矩形分割(隐含的电风扇)

    描述:https://www.luogu.com.cn/problem/P1790 有一个长为a,宽为b的矩形(1≤a≤6,2≤b≤6).可以把这个矩形看作是a*b个小方格. 我们现在接到了这样的一个 ...