2011-11-04 21 views
6

我希望有人可以解釋爲什麼兩個小時的數據清理據稱導致我的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也似乎證實我的分析。

回答

3

表的「數據長度」包括表中可能存在的任何可用空間。您可能需要OPTIMIZE表對錶進行碎片整理,釋放該空間。請注意,這可能會鎖定桌子一段時間,但它做到了。

使用InnoDB存儲引擎(CREATE TABLE (...) ENGINE=InnoDB;)將使表優化在很大程度上是不必要的,以及使數據庫通常更快。如果你沒有使用它,你可能應該開始。 :)

+0

感謝您的信息 - 表是一個InnoDB表(我只是雙重檢查),所以大概這不是原因? – esilver

+0

我可能找到了答案/有理論;因爲它聽起來像你在這個東西,你可以LMK,如果你認爲我的分析是正確的?謝謝! – esilver

+0

是的,你的分析看起來很合理。 – duskwuff