本机原本预期全表更新会让脏页堆起来,结果每0.3秒轮询一次,脏页数最多真实只摸到了1;就算把innodb_io_capacity真实调到100模拟慢速磁盘,脏页数依然真实压不住地被刷回0。
本机的innodb_buffer_pool_size真实是128MB,@@innodb_buffer_pool_instances真实只有1——这不是配置疏漏,是InnoDB真实的硬规则:buffer pool小于1GB时会被强制压成1个实例。
本机先发现意外:@@innodb_adaptive_hash_index真实是关闭的。真实打开之后第一遍耗时几乎没变,但adaptive_hash_searches已经真实在涨;第二遍真实降到108.6毫秒,快了约29%——热索引真的要跑热才有效果。
本机对着SHOW ENGINE INNODB STATUS的LOG部分每0.4秒轮询一次,一边跑全表更新:真实看到Log sequence number先跑到checkpoint前面,几轮之后checkpoint真实追了上来,两个数字又重新相等。
本机磁盘上真实存在两个doublewrite文件;运行至今真实已经写过475个页面、分成43批;本文又真实跑了一次写入,计数器真实多了1页1批——doublewrite真实把多个脏页打包成一批一起写入。
本文真实在本机另起了一个一次性的MySQL实例,写入3条真实提交的数据,开一个事务插入第4条但不提交,真实kill -9模拟崩溃。重启后3条已提交数据全部真实还在,第4条未提交的真实消失了。
本机用同样100行高重复度文本,一张表ROW_FORMAT=COMPRESSED,一张表DYNAMIC不压缩:磁盘上真实的.ibd文件,压缩表172032字节,不压缩表393216字节——真实压缩比约2.28倍。
本机innodb_file_per_table真实是开着的:独立表空间的表DROP之后.ibd文件真实立刻从磁盘消失;共享表空间(ibdata1)的表,DROP之后共享文件真实一个字节都没有缩小。
本机插入同样1000行数据,主键顺序插入真实触发14次页分裂;打乱顺序插入真实多触发19次——磁盘文件也真实证明:顺序插入344064字节,乱序插入425984字节,多花了约24%空间。
本机删掉表里70%的行之后,真实立刻查page merge计数器还是0;紧接着一条完全不命中数据的DELETE,真实触发了146次合并尝试、10次成功——页合并是被后续遍历顺带触发的。
本机对一张删了700行的表跑OPTIMIZE TABLE,MySQL真实提示会recreate加analyze。真实的效果也明显:文件从360448字节真实降到196608字节,缩了约45%。
本机删掉一张表一半的行,文件大小真实一个字节都没变,DATA_FREE字段全程真实都是0——真正能看出碎片的,只有OPTIMIZE TABLE前后真实的文件大小对比(缩小约28.6%)。