MySQL可以使用alter table tn engine=innodb语句进行表空间碎片整理。而页内记录并不是物理有序的,并且删除记录后,被删除的记录放到页内free链表,可能会产生很多空洞。alter table命令会重建表,这样的话,猜测可能扫描老表页内说有数据,一个一个的插入到新表中。是不是这个过程呢?跟踪了下堆栈:
(gdb) bt#0 btr_cur_optimistic_insert (flags=23, cursor=0xa34a4074, offsets=0xa34a40b4, heap=0xa34a40dc, entry=0xa6b72c8, rec=0xa34a40b8, big_rec=0xa34a40bc, n_ext=0, thr=0x0, mtr=0xa34a3c04)at /home/mysql26/mysql-5.6.26/storage/innobase/btr/:1241#1 0x087c006c in row_merge_insert_index_tuples (trx_id=9503, index=0xa6b7ca8, old_table=0xa4df530, fd=35, block=0x9d232000 "\002") at /home/mysql26/mysql-5.6.26/storage/innobase/row/:2519#2 0x087c3c5e in row_merge_build_indexes (trx=0xa63a358, old_table=0xa4df530, new_table=0xa625f20, online=true, indexes=0xa640d20, key_numbers=0xa640d28,
如果觉得《MySQL表空间碎片整理》对你有帮助,请点赞、收藏,并留下你的观点哦!