在test库下创建了一个分区表bk_user_action_log_1
mysql> show create table bk_user_action_log_1\G;
*************************** 1. row ***************************
Table: bk_user_action_log_1
Create Table: CREATE TABLE `bk_user_action_log_1` (
`id` int(12) unsigned NOT NULL AUTO_INCREMENT,
`operator_uid` bigint(12) unsigned NOT NULL,
`baike_id` int(11) unsigned NOT NULL,
`score` smallint(6) NOT NULL,
`score_type` tinyint(1) unsigned NOT NULL,
`operator_type` varchar(40) NOT NULL,
`object_id` int(11) unsigned NOT NULL DEFAULT '0',
`object_type` tinyint(1) unsigned NOT NULL,
`object_uid` bigint(12) unsigned NOT NULL,
`operator_time` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`,`operator_time`),
KEY `inx_operator_time` (`operator_time`),
KEY `inx_operator_uid_operator_type_object_id` (`operator_uid`,`operator_type`,`object_id`)
) ENGINE=InnoDB AUTO_INCREMENT=900001 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE ( operator_time)
(PARTITION p0 VALUES LESS THAN (1356969600) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (1362067200) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (1367337600) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (1372608000) ENGINE = InnoDB,
PARTITION p4 VALUES LESS THAN (1377964800) ENGINE = InnoDB,
PARTITION p5 VALUES LESS THAN (1383235200) ENGINE = InnoDB,
PARTITION p6 VALUES LESS THAN (1388505600) ENGINE = InnoDB,
PARTITION p7 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
1 row in set (0.00 sec)
------------------------------------
已经打开了每个表使用一个表空间
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image.png
cd /data/mysqldata/3306/test
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(1).png
创建了7个分区
其中只有第三个分区(bk_user_action_log_1#P#p3.ibd)中导入了数据
-----------------------------------------------------------------------------------------------------------------------------------------
使用了 innodb_space工具查看具体信息
(1)、查看当前表空间所有的页面记录。每个页面占用一行,
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd space-summary|head -n 10
page type prev next lsn
0 FSP_HDR 0 0 3429049085
1 IBUF_BITMAP 0 0 3429062361
2 INODE 0 0 3429049085
3 INDEX 0 0 3429049085
4 INDEX 0 0 3428907956
5 INDEX 0 0 3428876590
6 INDEX 0 7 3200646807
7 INDEX 6 8 3200706000
-------------------------------------------------------------------------------------------------------------------------------------------
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd space-summary|tail -n 10
11510 ALLOCATED 0 0 0
11511 ALLOCATED 0 0 0
11512 ALLOCATED 0 0 0
11513 ALLOCATED 0 0 0
11514 ALLOCATED 0 0 0
11515 ALLOCATED 0 0 0
11516 ALLOCATED 0 0 0
11517 ALLOCATED 0 0 0
11518 ALLOCATED 0 0 0
11519 ALLOCATED 0 0 0
可以看到一个分配了11520个页面,每个页面大小为16k,总大小为11520*16*1024=188743680,正好等于第三个分区的文件大小。
(2)、查看当前的所有区间的分配
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd space-extents
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(2).png
.....
.....
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(3).png
从11009开始就是未分配的区
(3)、查看页面所有页面的分配情况,对相同类型的页面进行了整理
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(4).png
可以看到第一个未分配的页面是8791,从(2)上面的截图中也可以看出8768是第一个未满的区的首页,从8768-8790为已经分配的页面。
(3)、查看页面在各个列表的情况
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd space-lists
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(5).png
free..当前已经分配的页面,完全没有被使用
length:1 有1个区
f:first free列表中的第一个空闲区的情况
f_page:0 需要在第0个页面去查找此区的情况
f_offset:7038 在这个页面的偏移量
l:last free列表中的最后一个空闲区的情况
l_page:0
l_offset :7308... 类似
第一个页面是属于fsp_header
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(6).png
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(7).png
上面的第0个页面偏移量为7308对应的xdes的xdes entry 172
{(0,150),(1,190).....(255,10350)},list node for xdes list是从每个xdex entry的第8个字节开始算起。
172*64=110008 11008页面正好是第一个空闲页面(属于第173个区)
同理可以算出
free_frag :xdes entry 165 165*64=10560 ---??这个区确实有空闲的页面,但是不明白干什么用的。
接着查看下free_frag的使用情况如下:
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd -L free_frag space-list-iterate
start_page page_used_bitmap
10560 #######.........................................................
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
full_frag: xdes entry (0,1) 分别表示第1个区和第2个区
free_nodes :
f_page:2
f_offset:38
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(8).png
f_page:2表示第三个页面,正好是file sgement inode page,偏移量为38,就是list node for inode page list的偏移量
而且这个数据结构占用了12个字节,如下所示,所以是代表下一个和上一个innod page的位置。
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(9).png
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(4)、接下来看当前的段情况,当前的存在的索引情况如下:
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(10).png
有三个索引,因为每个索引都包括叶子节点和非叶子节点,叶子节点占用一个inode entry,而非叶子节点也占用一个inode entry,所以三个索引共使用了6个inode entry,这些innod 都在file sgement inode page中分配,此环境中是在第三个页面(page 0)中分配。
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd space-indexes
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(11).png
查看某个索引的非叶子节点的页面情况:
因为page 3是根节点所以首先查看是否有完全为分配的页面
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd -p 3 index-fseg-internal-lists
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(12).png
都为0 说明非叶子节点的页面都是属于已经有记录,而且都有空闲空间的情况:
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd -p 3 index-fseg-internal-frag-pages
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(13).png
说明此索引一共有7个非叶子节点,其中6个非分支节点(level 1),一个为跟节点(level 2)
同理可以查看其他的两个索引的的情况。
(5)、现在可以看真正数据存放的地方了,也就是叶子节点的使用情况:
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd -p 3 index-fseg-leaf-frag-pages
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(14).png
这些页面是还未满的页面。
接着我们看已经被插满数据的页面情况:
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd -p 3 index-fseg-leaf-lists
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(15).png
78个区被插满数据,一个区是not_full,分别查看这两种情况:
a、[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd -p 3 -L full index-fseg-leaf-list-iterate
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(16).png
...
...
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(17).png
b、查看not_full的区间的情况:
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd -p 3 -L not_full index-fseg-leaf-list-iterate
file:///C:/Users/LENOVO/AppData/Local/Temp/enhtmlclip/Image(18).png
那么表中一共有90w条数据:
目前的叶子节点的使用情况是:
1、full extent:78个区,78*64=4992页面
2、not_full: 1个区 33个页面(10800--10912)
3、free_frag:33个page(innodb_space -f bk_user_action_log_1#P#p3.ibd -p 3 index-fseg-leaf-frag-pages|wc -l)
1、对于满的区来说没个页面都是178条数据(innodb_space -f bk_user_action_log_1#P#p3.ibd -p 10752 page-dump|grep format|wc -l)
所以一共有数据是178*4992=888576
2、33个页面中从10800--10911数据是插满的,而最后一个页面(10912)的数据为121:
[root@Mysql2 test]# innodb_space -f bk_user_action_log_1#P#p3.ibd -p 10912 page-dump|grep format|wc -l
122
所以一共有数据32*178+121=5817
3、33个page的情况可以从(5)看出来:31*178+89=5607
全部的数据为:888576+5817+5607=900000