我希望有人可以解釋爲什麼兩個小時的數據清理據稱導致我的mysql實例的數據使用量僅僅減少了32 KB。這裏是我的細節:解釋mysql的information_schema.tables DATA_LENGTH,INDEX_DATA_LENGTH和DATA_FREE
我有一個MySQL數據庫(在Amazon RDS上運行),我試圖從中清除數據。我這樣做是爲了避免存儲空間耗盡,因爲亞馬遜在1TB限制你,如果我們不採取行動,我們最終會達到這個限制。
我使用這個命令來計算我的表和索引的大小:
select * from information_schema.tables;
有特別消耗了我的大部分存儲兩個InnoDB表。我有一個迭代通過最大表刪除記錄的過程。在時間t = 0 I跑上述SQL查詢,並得到了數據長度和索引數據長度的結果如下:
- 數據長度:56431116288
- 索引數據長度:74233151488
兩小時後來,經過連續運行我的數據庫清理過程中,我跑了上面的SQL語句,並得到了以下幾點:
- 數據長度:56431083520
- 索引數據長度:74126147584
這基本上意味着我削減了32 KB的表數據和102 MB的索引數據。
指數的下降是有道理的。表格數據的減少非常小。在這段時間內不可能插入其他數據,因爲我在我的數據庫的備份副本上運行此測試(關於RDS的一個好處是您可以完整地複製數據庫並運行以運行實驗如這一個)。我也確認AUTO_INCREMENT的值是兩次相同的。
有人可以解釋爲什麼數據長度一點都沒有移動?數據長度只是一個非常快速和骯髒的近似值?是否還有其他一些壓縮步驟,mysql最終會做什麼?還是我完全錯誤地解釋了這些領域的使用?
謝謝!
更新
我可能已經理解了它 - 在時間t = 0
- DATA_FREE = 77594624
4小時laters,
- DATA_FREE = 256901120
這意味着我已經通過appx 171MB增加了DATA_FREE。
這是否意味着如果我插入另一個171MB,它會從DATA_FREE池出來,所以我的數據長度不會增加?換句話說,我從一個新的InnoDB表開始,插入20 GB的數據(假設20 GB包含所有剩餘的InnoDB內容,我意識到存儲在InnoDB中的數據比MyISAM大),然後刪除所有數據,然後我插入10 GB的數據。當我從information_schema.tables運行select *時,我應該看到數據長度爲10 GB,數據沒有10 GB,對吧?我不希望看到數據長度爲30 GB /數據不爲0 GB,也不應該預計數據長度爲10 GB /數據不超過10 GB?
更新2
This post on Stack Overflow也似乎證實我的分析。
感謝您的信息 - 表是一個InnoDB表(我只是雙重檢查),所以大概這不是原因? – esilver
我可能找到了答案/有理論;因爲它聽起來像你在這個東西,你可以LMK,如果你認爲我的分析是正確的?謝謝! – esilver
是的,你的分析看起來很合理。 – duskwuff