背景
有時(shí)候刪除了一張表一般的數(shù)據(jù)类浪,但是查看表占用空間發(fā)現(xiàn)并沒有發(fā)生變化喳逛。介是為嘛邮偎?
數(shù)據(jù)空洞
刪除導(dǎo)致的數(shù)據(jù)空洞
InnoDB的底層是B+樹管跺,B+樹的葉子節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù),因?yàn)榇疟P預(yù)讀原理禾进,一般葉子節(jié)點(diǎn)的大小會(huì)和page的大小保持一致豁跑。
當(dāng)我們刪除了數(shù)據(jù)后,并沒有把申請(qǐng)的空間還給操作系統(tǒng)泻云,而是將當(dāng)前空間標(biāo)記為“可復(fù)用”艇拍,這樣當(dāng)新數(shù)據(jù)插入時(shí),就不同重新再申請(qǐng)空間宠纯,可以直接將數(shù)據(jù)插入到“可復(fù)用”的空間中卸夕;
這樣“可復(fù)用”的空間,就稱為數(shù)據(jù)空洞婆瓜。
插入導(dǎo)致的數(shù)據(jù)空洞
當(dāng)向一個(gè)page已滿的葉子節(jié)點(diǎn)插入數(shù)據(jù)時(shí)快集,為了保證數(shù)據(jù)均衡,會(huì)把所有的數(shù)據(jù)再進(jìn)行一次分配廉白,使得兩個(gè)節(jié)點(diǎn)的數(shù)據(jù)量不會(huì)相差太多个初,但也就會(huì)造成有很多的“可復(fù)用”空間。
解決方案
- 重建一張表猴蹂,然后把數(shù)據(jù)刷進(jìn)新表院溺。
使用語句 alter table t engine = InnoDB - 在原表的基礎(chǔ)上,壓縮空間磅轻,去掉“可復(fù)用”空間珍逸。
使用語句 optimize table t