以前我们讲过mysql的sdi结构, innodb_file_per_table 和 general tablespace都讲过, 但是当某个表字段特别多的情况下, 我们就没有考虑到了. 于是又来补充以前的坑了.
sdi相当于一个特殊的索引, 也就是说它也是按照行存储的. 当使用innodb_file_per_table
时, 只有1行数据(不考虑summary那行), 当使用general tablespace时,存在多行数据(一个表一行). 当一个表的字段太多, 导致一个page放不下时, 就放到溢出页去.
sdi使用的溢出页和普通数据使用的溢出页不一样, 结构简单很多.
zip_size是指压缩后的大小, 是整个sdi的大小, 每个fil_page_sdi_blob都应该一样大.
next_pageno是下一页的pageno, 因为这一页也可能放不下所有的数据
zip_data zlib压缩后的数据
我们使用python3构建一个1000字段的表
import hashlib
sql = 'drop table if exists db1.t202502123;create table db1.t202502123('
for i in range(1000):
sql += '`' + hashlib.md5(str(i).encode()).digest().hex() + hashlib.md5(str(i*12345).encode()).digest().hex() + "` varchar(1),\n"
print(sql[:-2]+");")
然后使用最新版ibd2sql解析即可.
如果你使用旧版本的ibd2sql解析会得到报错
zlib.error: Error -3 while decompressing data: unknown compression method
虽然生产上一般不会出现这么多的字段. 但我们还是得支持!
参考:
https://www.modb.pro/db/1836232133276426240
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。